二叉树的遍历
0.二叉树及其遍历方式
0.0二叉树
如下图所示,一个二叉树
1)由有限个结点组成,
2)可以为空,
3)可以不为空,若不为空,则它是由根结点和称为其左子树T L 和右子树T R 的
两个不相交的二叉树组成。
0.1先序遍历
1)访问根结点
2)先序遍历其左子树
3)先序遍历其右子树
0.2中序遍历
1)中序遍历其左子树
2)访问根结点
3)中序遍历其右子树
0.3后序遍历
1)后序遍历其左子树
2)后序遍历其右子树
3)访问根结点
1.递归遍历
1.1 以中序遍历为例
1)中序遍历其左子树
2)访问根结点
3)中序遍历其右子树
void InOrderTraversal( BinTree BT )
{
if( BT ) {
InOrderTraversal( BT->Left );
printf(“%d”, BT->Data);
InOrderTraversal( BT->Right);
}
}
2.非递归遍历
2.1 以中序遍历为例
构想(使用堆栈):
1) 遇到一个结点,就把它压栈,并去遍历它的左子树;
2)当左子树遍历结束后,从栈顶弹出这个结点并访问它;
3) 然后按其右指针再去中序遍历该结点的右子树。
void InOrderTraversal( BinTree BT )
{
BinTree T=BT;
Stack S = CreatStack( MaxSize );
while( T || !IsEmpty(S) ){
while(T){
Push(S,T);/*一直向左并将沿途结点压入堆栈*/
T = T->Left;
}
if(!IsEmpty(S)){
T = Pop(S); /*结点出堆栈*/
printf(“%5d”, T->Data); /*访问结点*/
T = T->Right;/*转向右子树*/
}
}
}
2.2 先序遍历
void InOrderTraversal( BinTree BT )
{
BinTree T=BT;
Stack S = CreatStack( MaxSize );
while( T || !IsEmpty(S) ){
while(T){
printf(“%5d”, T->Data); /*访问结点*/
Push(S,T);/*一直向左并将沿途结点压入堆栈*/
T = T->Left;
}
if(!IsEmpty(S)){
T = Pop(S); /*结点出堆栈*/
T = T->Right;/*转向右子树*/
}
}
}