学习数据结构:二叉树的四种遍历

二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中所有的结点,使每个结点被访问一次且仅被访问一次。

前序遍历
规则:若二叉树为空则返回,否则优先访问根结点,然后前序遍历左子树,再前序遍历右子树。
如下图所示,遍历顺序为ABDGH-CEIF
在这里插入图片描述
实现遍历的算法,可以采用递归,简洁明了。

void PreOrdefTraverse(BiTree T)
{
	if(T==NULL)
		return ;
	//打印结点数据,也可进行其他操作
	printf("%c",T->data);
	//先遍历左子树
	PreOrdefTraverse(T->Lchild);
	//再遍历右子树
	PreOrderTraverse(T->rchild); 
}
	
	

在这里插入图片描述
以上面的二叉树为例:
当调用函数PreOrderTraverse(T),先判断当前结点是否为空。

if(T==NULL)
		return ;

打印当前结点数据,因为从根结点开始,故打印A

printf("%c", T->data);          

进入下一次函数调用,传入的参数是T->lchild,

PreOrderTraverse(T->lchild);   

同上述过程一样,先判断当前结点是否为空,不为空然后打印当前结点的数据B,调用函数传入左孩子结点的指针,判断打印……直到函数内判断结点数据为空时,退出函数返回到调用的起点,这时就会进入下一个传参右孩子的函数判断,以K为例,打印结点数据K后,下面两次函数的调用都返回为空, 函数退回到调用的位置H结点,在不断的回溯,直到遍历完左右子树为止。
前序遍历最后的结果为:ABDHKECFIGJ

中序遍历算法

二叉树的中序遍历算法,与前序遍历仅仅只是代码上的顺序差异。

void InOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	//中序遍历左子树
	InOrderTraverse(T->lchild);
	printf("%c",T->data);
	//最后遍历右子树
	InOrderTraverse(T->rchild);
}

结合代码,可以发现,中序遍历先把左子树的递归函数提前了。

在这里插入图片描述
以上图为例,
1.先调用函数InOrderTraverse(T),T不为NULL,调用InOrderTraverse(T->lchild),访问结点B;当前结点不为空,继续调用函数InOrderTraverse(T->lchild),访问结点D;不为空,继续调用InOrderTraverse(T->lchild),访问结点H;再次调用InOrderTraverse(T->lchild)访问结点H的左孩子,发现当前结点数据为空,返回到上一次访问H结点调用函数的地方。往下执行打印结点H。
2.然后调用函数InOrderTraverse(T->rchild),访问结点H的右孩子K,因为结点K无左孩子,打印结点k。K没有右孩子,所以结点H的函数执行完毕,返回到访问结点D的函数,执行打印结点D的代码。
……
后续代码原理同上。以中序遍历访问此结构的顺序为HKDBEA-IFCGJ

后序遍历算法
前序和中序遍历算法如果理解了,那么后序遍历肯定也就一目了然了。调整代码顺序,把要执行的功能代码,放到不同的位置就可以达到目的。

void PostOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	//功能代码
	printf("%c",T->data);
}

在这里插入图片描述遍历的过程,同前序中序一样,不做赘述。此结构后序遍历结果为:KHDEB-IFJGCA。

层序遍历算法
从字面意思,就能猜到此算法的原理,从根节点开始,一层一层的从左到右遍历每一个结点。
推到遍历结果

1.已知一颗二叉树的前序遍历为ABCDEF,中序遍历为CBAEDF,求这棵树的后序遍历结果。

从两种遍历原理可知,前序与中序都是从跟结点开始。前序遍历先打印在递归,字母A就是根节点。中序遍历,CBAEDF,可知CB是A的左子树的结点,EDF是右子树的结点。在由前序遍历先打印后遍历可知,B是A的左孩子,而C则是B的孩子,但不能确定是左孩子还是右孩子。中序遍历,C先打印B后打印,说明C是B的左孩子,否则的话就是右孩子。如图:
在这里插入图片描述
在看前序遍历中的EDF,他的顺序是DEF,说明D是A的右孩子,E F为D的子孙,此时不能确定EF是否都为D的孩子,也可能是孙子结点。 看中序遍历中,三者的顺序的是EDF,E在D的左侧先打印,说明E是左孩子,则F是D右孩子。最终得到了二叉树如下:
在这里插入图片描述
故后序遍历为:CBEFDA

2.反过来如果二叉树的中序遍历为:ABCDEFG,后序遍历为:BDCAFGE。求前序遍历序列。

后序遍历BDCAFGE,可知根节点为E,由中序遍历可知,ABCD为结点E的左子树,FG结点E的右子树。A为E的左孩子,BCD为A的子孙,G是E的右孩子。中序遍历,BCD顺序,可知B是C的左孩子,D是C的右孩子。从现在已分析出的条件,就可以得出前序序列:EACBD-GF。

从上面的两个例子,可以得到一个结论:
已知前序序列和中序序列,可以确定一颗二叉树。
已知后序序列和中序序列,可以确定一颗二叉树。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值