二叉树的遍历
“遍历”是任何类型均有的操作,
对线性结构而言,只有一条搜索路
径(因为每个结点均只有一个后继),
故不需要另加讨论。而二叉树是非
线性结构,
每个结点有两个后继,
则存在如何遍历即按什么样的搜索
路径遍历的问题。
对“二叉树”而言,可以有两条搜索路径:
1.先上后下的按层次遍历;
2.先左(子树)后右(子树)的遍历;
二、先左后右的遍历算法
先(根)序的遍历算法
中(根)序的遍历算法
后(根)序的遍历算法
先(根)序的遍历算法:
若二叉树为空树,则空操作;否则,
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
列:
前序遍历序列:A B D C
中(根)序的遍历算法
若二叉树为空树,则空操作;否则,
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
中序遍历序列:B D A C
后(根)序的遍历算法:
若二叉树为空树,则空操作;否则,
(1)后序遍历左子树;
(3)访问根结点。
后序遍历序列: D B C A
二:
遍历算法的应用举例
算法的递归描述(先序遍历)
void Preorder ( BiTree T )
{
if ( T )
{//如果树不为空
cout<< T -> data <<“ “ ; //输出根结点
Preorder ( T -> lchild ) ; //先序遍历左子树
Preorder ( T -> rchild ) ; //先序遍历右子树
}
}
1、统计二叉树中叶子结点的个数
算法基本思想:
先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。
由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增1。
void CountLeaf (BiTree T, int& count){
if ( T ) {
if ((!T->lchild)&& (!T->rchild))
count++; // 对叶子结点计数
CountLeaf ( T->lchild, count);
CountLeaf ( T->rchild, count);
} // if
} // CountLeaf
l将二叉树分为五种形态进行讨论:
求叶子结点个数
分析:① 0; ② 1; ③ L; ④ R; ⑤ L+R
简化:③④⑤可合并成⑤
求叶子结点个数
int LeafCount ( BinTree bt )
{
if ( bt==NULL ) return 0; //空二叉树
if ( bt->lchild==NULL && bt->rchild==NULL)
return 1; //只有一个结点
L = LeafCount ( bt->lchild );
R = LeafCount ( bt->rchild );
return L + R;
}
2、求二叉树的深度
分析:
① 0;
② 1;
③ 1+L;
④ 1+R;
⑤ 1+max(L,R)。
简化:②③④⑤可合并成⑤。
求二叉树的深度
三:
int Depth ( BinTree bt )
{
if ( bt==NULL )
return 0;
L = Depth ( bt->lchild );
R = Depth ( bt->rchild );
return 1 + max ( L , R );
}
三:
层次遍历二叉树
层次遍历顺序为:
A B C D E F
特点:
先被遍历的结点的孩子先于后遍历的结点的孩子遍历