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.19)0001 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
- python实现二叉树的前、中、后序遍历及按层遍历
- 二叉树的创建、前/中/后序遍历、按层遍历C语言实现
- JAVA实现二叉树的前、中、后序遍历
- C++二叉树的前序、中序、后序遍历及实现
- 数据结构 二叉树的递归算法、前序、中序、后序遍历(c语言实现)
- 二叉树的遍历方法及根据前/中(后/中)序遍历求后(前)序遍历的代码实现
- 二叉树的前序遍历、中序遍历及后序遍历
- 二叉树的前序遍历,中序遍历和后序遍历(c#)
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树非递归前、中、后序遍历实现
- Java二叉树(一)--定义及前序、中序、后序、层次遍历及求高度的实现
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 二叉树:前序、中序、后序、层次遍历及实现
- 二叉树的遍历问题-----Java实现(中序、前序、后序、遍历)
- 二叉树的遍历--用递归 和栈 实现 前序、中序、后序遍历
- C语言实现 前序、中序、后序遍历二叉树
- java 实现二叉树深度优先遍历的 前、中、后序遍历(递归)
- 二叉树的前/中/后/层序遍历(前/中/后序递归实现,层序队列实现)
- php原始代码实现无刷新删除
- 搭建Eclipse+ADT+Android SDK 安卓开发环境
- TCP连接的部分细节及边界情况分析
- 触摸左右滑动发生事件
- vue 选项卡
- C++二叉树的前序、中序、后序遍历及实现
- Leetcode 221. Maximal Square (Medium) (cpp)
- LeetCode笔记:172. Factorial Trailing Zeroes
- Es tut noch weh 双语歌词
- iOS被开发者遗忘在角落的NSException-其实它很强大
- 安卓实现复读功能
- Linux发行版Red-Hat下相关命令
- java执行linux命令
- Qt 的QString类的使用