二叉树的遍历

二叉树的遍历

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. 三种遍历的抽象

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值