二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问且被访问一次。
二叉树的遍历方法
1.前序遍历
规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如图所示。(有点类似于DFS)
下面我们来看看它的算法实现
实现二叉树的前序遍历算法:
void PreOrderTraverse(BiTree T){
if(T==NULL){
return
}
printf("%c",T->data); //打印结点数据
PreOrderTraverse(T->lchild); //先序遍历左子树
PreOrderTraverse(T->rchild); //先序遍历右子树
return;
}
如图6-8-6所示,我们可以模拟递归过程,最终的顺序为:ABDHKECFIGJ.
2.中序遍历
规则是若二叉树为空,则空操作返回,否则从根结点点开始(特别注意不是访问根结点),中序遍历根结点的左子树,然后是访问根结点,左后中序遍历右子树。如图。
其实看到这里,可能对中序遍历还是一头雾水。别急,如果你前序遍历法和递归掌握的不差,那么我们看看代码,就会豁然开朗。
实现二叉树的中序遍历算法:
void PreOrderTraverse(BiTree T){
if(T==NULL){
return
}
PreOrderTraverse(T->lchild); //中序遍历左子树
printf("%c",T->data); //打印结点数据
PreOrderTraverse(T->rchild); //最后中序遍历右子树
return;
}
如图6-8-6所示,我们可以模拟递归过程,最终的顺序为:HKDBEAIFCGJ.
3.后序遍历
规则是若二叉树为空,则空操作返回,否则按照从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。如图。
同样我们来看看它的算法实现
实现二叉树的后序遍历算法:
void PreOrderTraverse(BiTree T){
if(T==NULL){
return
}
PreOrderTraverse(T->lchild); //先后序遍历左子树
PreOrderTraverse(T->rchild); //再后序遍历右子树
printf("%c",T->data); //最后打印结点数据
return;
}
如图6-8-6所示,我们可以模拟递归过程,最终的顺序为:KHDEBIFJGCA.
4.层序遍历
规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,同层中按照从左往右的顺序逐个访问。如图。
参考:
大话数据结构/程杰 著.—北京:清华大学出版社,2011.6