5.5 二叉树的先/中/后序遍历

36 篇文章 0 订阅
36 篇文章 0 订阅

二叉树的遍历

  1. 遍历:按照某种次序把所有的结点都访问一遍
  2. 层次遍历:基于树的层次特性确定的次序规则
  3. 先/中/后序遍历:基于属的递归特性确定的次序规则

一、先序遍历(根左右)

​ 分支结点逐层展开法

操作:

  1. 若二叉树为空,则什么都不做

  2. 若非空:

    ①访问根节点;②先序遍历左子树;③先序遍历右子树

  3. 小方法:

    从根结点出发,画一条路:如果左边还有没走的路,优先往左走,走道路的尽头(空结点)就往回走,如果左边没路了,就往右走,如果左、右都没路了,就往上走

    先序遍历–第一次路过时访问节点(每个结点都会被路过3次

typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//先序遍历
void PreOrder(BiTree T){
    if(T!=NULL){
        visit(T);				//访问根节点
        PreOrder(T->lchild);	//递归遍历左子树
        PreOrder(T->rchild);	//递归遍历右子树
    }
}

二、中序遍历(左根右)

中序遍历–第二次路过时访问节点(每个结点都会被路过3次

typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//先序遍历
void PreOrder(BiTree T){
    if(T!=NULL){
        PreOrder(T->lchild);	//递归遍历左子树
        visit(T);				//访问根节点
        PreOrder(T->rchild);	//递归遍历右子树
    }
}

三、后序遍历(左右根)

后序遍历–第三次路过时访问节点(每个结点都会被路过3次

typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//先序遍历
void PreOrder(BiTree T){
    if(T!=NULL){
        PreOrder(T->lchild);	//递归遍历左子树
        PreOrder(T->rchild);	//递归遍历右子树
        visit(T);				//访问根节点
    }
}

以上三种方法,空间复杂度为O(h)

四、遍历算法的应用举例

  • 求树的深度
int treeDepth(BiTree T){
    if(T==NULL){
        return 0;
    }
    else{
        int l = treeDepth(T->lchild);
        int r = treeDepth(T->rchild);
        //树的深度=Max(左子树深度,右子树深度)+1
        return l>r ? l+1 : r+1;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值