1. 程式人生 > >樹的遍歷【後序遍歷】

樹的遍歷【後序遍歷】

程式碼

舉例

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 + "-"); } } }

分析

  1. 後續遍歷。 左右中 的次序列印節點,需要來到節點 3次
    1. 通過該節點 遍歷左子樹 ,通過該節點 遍歷右子樹, 遍歷自身
  2. 在原來 兩次基礎上,疊加一次,如何解決疊加問題?
    1. 原來能進行 兩次的原因是?
    2. 藉助了棧 先進後出 的特性,先把遍歷節點壓入棧,而後取出再次遍歷
    3. 如果 3次 無法實現,採用什麼方法?
    4. 逆序 後序遍歷 - 得到中右左的順序
    5. 怎麼求 中右左的順序?以及怎麼逆序中右左?
    6. 引入 棧2,儲存中右左的順序,依次取出就是後序遍歷
    7. 關鍵是求導 - 中右左
    8. 中右左 和 中左右 【先序遍歷】遍歷過程中的差別?
  3. end