首页 > 学院 > 开发设计 > 正文

6.3.1遍历二叉树

2019-11-08 02:10:51
字体:
来源:转载
供稿:网友

遍历二叉树(traversing binary tree)

从根结点出发,按照某种次序,依次访问二叉树中所有结点,使得每个结点被访问次仅此一次。

先序遍历:

若二叉树为空,则空操作。否则

1.访问跟结点;

2.先遍历左子树;

3.先遍历右子树。

中序遍历:

若二叉树为空,则空操作。否则

1.先遍历左子树;

2.访问跟结点;

3.先遍历右子树。

后序遍历:

若二叉树为空,则空操作。否则

1.先遍历右子树。

2.先遍历左子树;

3.访问跟结点;

下面给出一张图:

那么,他的遍历。我们来看看。

先序遍历为:ABDHIEJCFKG。

中序遍历为:HDIBEJAFKCG。

后续遍历为:HIDJEBKFGCA。

下面我们来演示代码操作。

代码是按照先序遍历的输入,然后输出他们所在的层数。

下面是代码:

#include <stdio.h>#include <stdlib.h>#include <Windows.h>typedef char Elemtype;typedef struct BiTNode{	char data;	struct BiTNode *lchild, *rchild;}BiTNode,*BiTree;//要求用户按照前序遍历输入数据void CreateBiTree(BiTree *T){	char c;	scanf_s("%c", &c);	if ('$' == c)	{		*T = NULL;	}	else	{		*T = (BiTNode *)malloc(sizeof(BiTNode));		(*T)->data = c;		CreateBiTree(&(*T)->lchild);	//创建左子树		CreateBiTree(&(*T)->rchild);	//创建右子树	}}//访问二叉树结点操作void visit(char c, int level){	PRintf_s("%c位于第%d层/n", c, level);}//遍历二叉树void PreOrderTraverse(BiTree T, int level){	if (T)	{		visit(T->data, level);		PreOrderTraverse(T->lchild, level + 1);		PreOrderTraverse(T->rchild, level + 1);	}}int main(){	int level = 1;	BiTree T = NULL;	CreateBiTree(&T);	PreOrderTraverse(T, level); 	system("pause");	return 0;}运行结构如下:

下面来解释下。这个$,就是当某个子树他没有左孩子,或者右孩子的时候为NULL,用$代表NULL

如下图所示:

那么这个树的先序遍历为:

ABDH$$I$$E$J$$CF$K$$G$$

那么中序遍历和后续遍历呢?

只需要改变下面这个代码就可以了:

中序遍历:

		PreOrderTraverse(T->lchild, level + 1);                visit(T->data, level);		PreOrderTraverse(T->rchild, level + 1);

后续遍历:

		PreOrderTraverse(T->lchild, level + 1);		PreOrderTraverse(T->rchild, level + 1);                visit(T->data, level);


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表