二叉树的遍历

二叉树的遍历

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;/*转向右子树*/
        }
    }
}

3. 三种遍历的抽象

这里写图片描述

展开阅读全文

没有更多推荐了,返回首页