樹的遍歷【後序遍歷】
阿新 • • 發佈:2018-12-10
程式碼
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