非递归后序遍历二叉树
Posted 贾斯彼迭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非递归后序遍历二叉树相关的知识,希望对你有一定的参考价值。
如果用2个栈实现,思路比较简单。
第一个栈S1先放结点,第二个栈S2放S1弹出的结点。
实现过程如下:
不由分说先将头节点放入S1。
① 弹出头节点
② 依次将头节点的左右孩子压入栈S1。重复①直至栈空。
public static void posOrderUnRecur1(Node head) { System.out.print("pos-order: "); if (head != null) { Stack<Node> s1 = new Stack<Node>(); Stack<Node> s2 = new Stack<Node>(); s1.push(head); while (!s1.isEmpty()) { head = s1.pop(); s2.push(head); if (head.left != null) { s1.push(head.left); } if (head.right != null) { s1.push(head.right); } } while (!s2.isEmpty()) { System.out.print(s2.pop().value + " "); } } System.out.println(); }
如果用一个栈实现。我们需要先定位到该树的最左子节点。
关键问题是,对于一个结点,如何判断该节点的状态,是
①啥都没打印,往左打印 (处理左子树) 还是
②左子树已经打印完毕,往右打印 (处理右子树) 还是
③左右子树都已打印完毕,打印自己再网上
需要一个辅助变量pre表示上一个打印的结点。令当前结点为cur,
对①,cur 的左孩子不为null,且pre不等于cur的左孩子和右孩子
对②,cur的右孩子不为null,且pre不等于cur的右孩子
对③,其他情况。
public static void posOrderUnRecur2(Node h) { System.out.print("pos-order: "); if (h != null) { Stack<Node> stack = new Stack<Node>(); stack.push(h); Node c = null; while (!stack.isEmpty()) { c = stack.peek(); if (c.left != null && h != c.left && h != c.right) { stack.push(c.left); } else if (c.right != null && h != c.right) { stack.push(c.right); } else { System.out.print(stack.pop().value + " "); h = c; } } } System.out.println(); }
以上是关于非递归后序遍历二叉树的主要内容,如果未能解决你的问题,请参考以下文章