二叉樹的後序遍歷post order演算法

jdon發表於2019-03-11

後序遍歷也是深度優先演算法,在後順序遍歷中,首先訪問左子樹,然後訪問右子樹,最後列印節點或根的值。這就是為什麼根值總是在後序遍歷中最後列印的原因。與許多樹演算法一樣,實現後序遍歷的最簡單方法是使用遞迴。實際上,如果您知道如何使用遞迴編寫先序,則可以使用相同的演算法稍作調整來實現後序遍歷。

使用遞迴進行後序遍歷
遞迴演算法很容易理解,因為它與遞迴preOrder和遞迴inOrder遍歷完全相似。 唯一不同的是訪問或遍歷左子樹,右子樹和根的順序,如下面的程式碼片段所示。

private void postOrder(TreeNode node) {
    if (node == null) {
      return;
    }

    postOrder(node.left);
    postOrder(node.right);
    System.out.printf("%s ", node.data);
  }



在後序遍歷中列印二叉樹的Java程式
這裡是一個完整的Java程式,用於在後序遍歷中列印二叉樹的所有節點。
先建立一個名為BialayTrand的類來表示Java中的二叉樹。此類有一個靜態巢狀類來表示樹節點,稱為TreeNode。這類似於map.entry類,用於表示雜湊表中的條目。該類只保留對root的引用,Treenode負責照顧左右子項。
這個類有兩個方法postOrder()和postOrder(TreeNode root),第一個是public,第二個是private。實際遍歷是在第二種方法中完成的,但由於root是類內部的,客戶端無法訪問root,因此建立了postOrder()方法來呼叫私有方法。這是實現遞迴演算法的常用技巧。
這也使您可以在不影響客戶端的情況下更改演算法。我們可以將遞迴演算法改為迭代演算法,客戶端仍然會呼叫post order方法而不知道現在迭代演算法已經到位了。

按後序列印二叉樹節點

import java.util.Stack;

/*
 * Java Program to traverse a binary tree 
 * using postOrder traversal without recursion. 
 * In postOrder traversal first left subtree is visited, followed by right subtree
 * and finally data of root or current node is printed.
 * 
 * input:
 *     55
 *    /  \
 *   35   65
 *   / \    \
 *  25  45   75
 *  /  /  \
 * 15 87  98
 * 
 * output: 15 25 45 35 87 98 75 65 55 
 */

public class Main {

  public static void main(String[] args) throws Exception {

    // construct the binary tree given in question
    BinaryTree bt = BinaryTree.create();

    // traversing binary tree using post-order traversal using recursion
    System.out.println("printing nodes of a binary tree on post order in Java");

    bt.postOrder();

  }

}

class BinaryTree {
  static class TreeNode {
    String data;
    TreeNode left, right;

    TreeNode(String value) {
      this.data = value;
      left = right = null;
    }

    boolean isLeaf() {
      return left == null ? right == null : false;
    }

  }

  // root of binary tree
  TreeNode root;

  /**
   * traverse the binary tree on post order traversal algorithm
   */
  public void postOrder() {
    postOrder(root);
  }

  private void postOrder(TreeNode node) {
    if (node == null) {
      return;
    }

    postOrder(node.left);
    postOrder(node.right);
    System.out.printf("%s ", node.data);
  }

  /**
   * Java method to create binary tree with test data
   * 
   * @return a sample binary tree for testing
   */
  public static BinaryTree create() {
    BinaryTree tree = new BinaryTree();
    TreeNode root = new TreeNode("55");
    tree.root = root;
    tree.root.left = new TreeNode("35");
    tree.root.left.left = new TreeNode("25");
    tree.root.left.left.left = new TreeNode("15");

    tree.root.left.right = new TreeNode("45");
    tree.root.right = new TreeNode("65");
    tree.root.right.right = new TreeNode("75");
    tree.root.right.right.left = new TreeNode("87");
    tree.root.right.right.right = new TreeNode("98");

    return tree;
  }

}

Output
printing nodes of a binary tree on post order in Java
15 25 87 98 45 35 75 65 55  



 

相關文章