代码
package com.uj.nsnc.test;
import org.junit.Test;
import java.util.Stack;
public class BinaryTreeTravel {
class Node{
public Node left;
public Node right;
public int value;
Node(Node left, Node right, int value) {
this.left = left;
this.right = right;
this.value = value;
}
}
@Test
public void testBinaryTreeTravel(){
Node node4 = new Node(null,null,2);
Node node5 = new Node(null,null,1);
Node node3 = new Node(null, node5, 3);
Node node2 = new Node(null, node4, 2);
Node node1 = new Node(node2, node3, 1);
PostOrderTraversalByStack(node1);
}
private void PostOrderTraversalByStack(Node tree){
if(tree==null)
return;
Node temp = tree;
Stack<Node> stack = new Stack<>();
Stack<Node> result = new Stack<>();
while (!stack.empty() || temp!=null) {
while (temp != null) {
stack.push(temp);
temp = temp.right;
}
Node node = stack.pop();
result.push(node);
temp = node.left;
}
while (!result.empty()) {
System.out.print(result.pop().value + "-");
}
}
}
分析
- 后续遍历。
左右中
的次序打印节点,需要来到节点 3次
。
- 通过该节点
遍历左子树
,通过该节点 遍历右子树
, 遍历自身
- 在原来
两次
基础上,叠加一次,如何解决叠加问题?
- 原来能进行
两次
的原因是?
- 借助了栈
先进后出
的特性,先把遍历节点压入栈,而后取出再次遍历
- 如果
3次
无法实现,采用什么方法?
逆序
后序遍历 - 得到中右左的顺序
- 怎么求 中右左的顺序?以及怎么
逆序
中右左?
- 引入
栈2
,保存中右左的顺序,依次取出就是后序遍历
- 关键是求导 - 中右左
- 中右左 和
中左右
【先序遍历】遍历过程中的差别?
- 参考非递归
中左右
原理可得
- end