C++二叉树的前序、中序、后序遍历及实现

来源:互联网 发布:ipad加入网络密码错误 编辑:程序博客网 时间:2024/05/24 03:20

二叉树的三种遍历方式

1. 先序遍历

遍历过程为:

  • 访问根节点
  • 先序遍历其左子树
  • 先序遍历其右子树
void PreOrderTraversal( BinTree BT){    if(BT){           //检验节点是否存在        printf("%d",BT->Data);        PreOrderTraversal(BT->Left);   //递归左子数        PreOrderTraversal(BT->Right);    }}

2. 中序遍历

遍历过程为:

  • 中序遍历其左子树
  • 访问根节点
  • 中序遍历其右子树
void PreOrderTraversal( BinTree BT){    if(BT){           //检验节点是否存在    PreOrderTraversal(BT->Left);   //先递归左子数        printf("%d",BT->Data);        PreOrderTraversal(BT->Right);   //然后对右边递归    }}

2. 后序遍历

遍历过程为:

  • 先序遍历其左子树
  • 先序遍历其右子树
  • 访问根节点
void PreOrderTraversal( BinTree BT){    if(BT){           //检验节点是否存在    PreOrderTraversal(BT->Left);   //先递归左子数        PreOrderTraversal(BT->Right);   //然后对右边递归        printf("%d",BT->Data);    }}

这里写图片描述
(在 遍历三种不同方式的二叉树是秩序挪动printf的位置,但在入栈出栈时后序遍历不仅仅是挪动位置这么简单,后面介绍)

**二叉树的后序遍历

  • 相对于前序和中序的遍历方式,因为前序相当于访问节点一次即输出,对于堆栈出栈来说,持续访问左节点,并且在访问途中输出相应的节点即可满足。
  • 同理对于中序,遇到一个节点,把它压栈,并且遍历左子树,当左子树遍历结束时,弹出并且访问它,然后在用右指针再去中序遍历该节点的右子树。
  • 对于后序遍历,依次沿途所欲节点入栈,左子树遍历,并将有右子树的节点优先入栈,然后在转到左子树(注:为了出栈顺序),若不满足左子树,则需直接压栈右子树,最后一次弹出栈顶元素。
(《数据结构》邓俊辉-代码5.190001 template <typename T> //在以S栈顶节点为根的子树中,找到最高左侧可见叶节点0002 static void gotoHLVFL ( Stack<BinNodePosi(T)>& S ) { //沿途所遇节点依次入栈0003    while ( BinNodePosi(T) x = S.top() ) //自顶而下,反复检查当前节点(即栈顶)0004       if ( HasLChild ( *x ) ) { //尽可能向左0005          if ( HasRChild ( *x ) ) S.push ( x->rc ); //若有右孩子,优先入栈0006          S.push ( x->lc ); //然后才转至左孩子0007       } else //实不得已0008          S.push ( x->rc ); //才向右0009    S.pop(); //返回之前,弹出栈顶的空节点0010 }0011 0012 template <typename T, typename VST>0013 void travPost_I ( BinNodePosi(T) x, VST& visit ) { //二叉树的后序遍历(迭代版)0014    Stack<BinNodePosi(T)> S; //辅助栈0015    if ( x ) S.push ( x ); //根节点入栈0016    while ( !S.empty() ) {0017       if ( S.top() != x->parent ) //若栈顶非当前节点之父(则必为其右兄),此时需0018          gotoHLVFL ( S ); //在以其右兄为根之子树中,找到HLVFL(相当于递归深入其中)0019       x = S.pop(); visit ( x->data ); //弹出栈顶(即前一节点之后继),并访问之0020    }0021 }
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家中挖矿噪音很大怎么办 学了栏目包装不想干怎么办 在文本打字乱了怎么办 体考后觉得成绩有出入怎么办 荧光棒进眼睛里怎么办 无法读源文件或磁盘怎么办 爱剪辑视频横着怎么办 pr界面字体太小怎么办 0p手机卡槽坏了怎么办 pr视频有水波纹怎么办 手机耳机插口插上没声音怎么办 xp系统电脑没有声音怎么办 win10笔记本耳机没声音怎么办 电脑插耳机还是外放怎么办 主机电脑耳机插孔坏了怎么办 苹果6plus有点卡怎么办 手机拨通电话后黑屏怎么办 手机拨通后没声音怎么办 苹果手机铃声不响了怎么办 婴儿喘气粗好像有痰怎么办 金毛呼吸声很大怎么办 回看福建导视该怎么办 楼上木地板走路声音都很响怎么办 班里团支不搭理我我该怎么办 客户买家具说贵怎么办 英雄联盟超出显示范围怎么办 脸上有斑点怎么办内条 脖子扭到了一动就疼怎么办 杭州限行在路上怎么办 在路上限行了怎么办 微信号不能进群怎么办 在微信约妹子被骗2000怎么办 qq号进不了热聊怎么办 网上买彩票中五百万怎么办 别人登我支付宝怎么办 医保刷卡刷到现金支付怎么办 微信诈骗立案后怎么办 奔跑吧诈骗填写了身份证怎么办 快手绑定的手机号丢了怎么办 球球大作战绑定手机号丢了怎么办 快手绑定手机号丢了怎么办