(续面试之常考二叉树)非递归遍历二叉树(先序、中序、后序)
来源:互联网 发布:数据库sql语句在哪 编辑:程序博客网 时间:2024/06/04 23:25
非递归遍历二叉树(先序、中序、后序)
采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。
1、前序遍历的非递归实现
根据先序遍历的顺序,先访问根节点,再访问左子树,后访问右子树,而对于每个子树来说,又按照同样的访问顺序进行遍历,上图的先序遍历顺序为:ABDECF。非递归的实现思路如下:
对于任一节点P,
1)输出节点P,然后将其入栈,再看P的左孩子是否为空;
2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作;
3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;
4)若不为空,则循环至1)操作;
5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否为空,重复4)和5)操作;
6)直到当前节点P为NULL并且栈空,遍历结束。
下面以上图为例详细分析其先序遍历的非递归实现过程:
首先,从根节点A开始,根据操作1),输出A,并将其入栈,由于A的左孩子不为空,根据操作2),将B置为当前节点,再根据操作1),将B输出,并将其入栈,由于B的左孩子也不为空,根据操作2),将D置为当前节点,再根据操作1),输出D,并将其入栈,此时输出序列为ABD;
由于D的左孩子为空,根据操作3),将栈顶节点D出栈,但不输出,并将其右孩子置为当前节点;
由于D的右孩子为空,根据操作5),继续将栈顶节点B出栈,但不输出,并将其右孩子置为当前节点;
由于B的右孩子E不为空,根据操作1),输出E,并将其入栈,此时输出序列为:ABDE;
由于E的左孩子为空,根据操作3),将栈顶节点E出栈,但不输出,并将其右孩子置为当前节点;
由于E的右孩子为空,根据操作5),继续将栈顶节点A出栈,但不输出,并将其右孩子置为当前节点;
由于A的右孩子C不为空,根据操作1),输出C,并将其入栈,此时输出序列为:ABDEC;
由于A的左孩子F不为空,根据操作2),则将F置为当前节点,再根据操作1),输出F,并将其入栈,此时输出序列为:ABDECF;
由于F的左孩子为空,根据操作3),将栈顶节点F出栈,但不输出,并将其右孩子置为当前节点;
由于F的右孩子为空,根据操作5),继续将栈顶元素C出栈,但不输出,并将其右孩子置为当前节点;
此时栈空,且C的右孩子为NULL,因此遍历结束。
非递归实现代码如下:
public static void pre_traverse(Node node) { Stack<Node> stack = new Stack<Node>(); //创建一个空栈 Node pCur = node; //定义用来指向当前访问的节点的指针 //直到当前节点pCur为NULL且栈空时,循环结束 while(!(pCur==null && stack.isEmpty())) { //从根节点开始,输出当前节点,并将其入栈, //同时置其左孩子为当前节点,直至其没有左孩子,及当前节点为NULL while(pCur != null){ System.out.println(pCur.data); stack.push(pCur); pCur = pCur.left; } //如果当前节点pCur为NULL且栈不空,则将栈顶节点出栈, //同时置其右孩子为当前节点,循环判断,直至pCur不为空 pCur = (Node) stack.pop(); pCur = pCur.right; } }
http://blog.csdn.net/pi9nc/article/details/13008511/
- (续面试之常考二叉树)非递归遍历二叉树(先序、中序、后序)
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 二叉树非递归和递归遍历(先序,中序,后序)
- 二叉树的先序、中序、后序遍历(递归 and 非递归)
- 先序遍历中序遍历后序遍历确定一棵二叉树(递归、非递归)
- 非递归遍历二叉树(先序、中序、后序、层序)
- c++ 二叉查找树 非递归(先序、中序、后序)遍历
- 二叉树的非递归遍历(先序,中序,后序)
- 二叉树的非递归(先序、中序、后序)遍历
- 二叉树遍历的非递归算法(先序、中序、后序)代码实现
- 二叉树-非递归遍历(先、中、后)
- 二叉树的遍历(2)--先序遍历,中序遍历,后序遍历(非递归)
- 二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- Java二叉树(三)--非递归的中序_先序_后序遍历二叉树
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 非递归先序遍历二叉树、非递归中序遍历二叉树、非递归后序遍历二叉树
- 二叉树非递归先序遍历、中序遍历、后序遍历
- vue项目输入无效地址时重定向到指定页面
- 在eclipse上使用github协同开发说明书
- 虚函数(二)
- ARM NEON 编程系列2——基本指令集
- java的byte数组的不同写法
- (续面试之常考二叉树)非递归遍历二叉树(先序、中序、后序)
- 一步步写STM32 OS【三】PendSV与堆栈操作
- 四边形不等式
- 一个通用的事件监听函数
- 获得maven地址,如何从中央仓库中下载jar
- 关于pdf转html的个人方法
- Depth Only
- MYSQL在15分钟插入千万条数据
- chatterbot中的trains.py详细解释