如何計算二叉樹中葉節點的數量 - Java迭代和遞迴演算法

jdon發表於2019-03-13

二叉樹葉節點總數的遞迴演算法
計算葉節點總數的演算法與關於列印葉節點的問題非常相似。 以下是要遵循的實際步驟:

1)如果節點為空返回0,這也是我們遞迴演算法的基本情況
2)如果遇到葉節點,則返回1
3)左、右子樹重複該過程。
4)返回左、右子樹葉節點的和
下面是基於上述邏輯的示例程式碼

private int countLeaves(TreeNode node) {
    if (node == null)
      return 0;

    if (node.isLeaf()) {
      return 1;
    } else {
      return countLeaves(node.left) + countLeaves(node.right);
    }
  }


也許您注意到這個方法是私有的,我已經在BinaryTree類中宣告瞭這個方法。為了在外部訪問它,我建立了另一個方法countLeafNodesRecursivel(),如下所示:

 
public int countLeafNodesRecursively() {
    return countLeaves(root);
  }


這樣做有兩個原因,最初的方法需要一個起始節點,它應該是root。 客戶端只需呼叫此方法就可以了,因為Bin已經可以使用BinaryTree類。 然後,包裝方法將根傳遞給計算葉節點的實際方法。 包裝方法是公共的,這樣客戶端就可以訪問它,而實際的方法是私有的,這樣任何人都無法看到它,開發人員將來可以在不影響客戶端的情況下更改實現。這實際上是揭示需要引數的遞迴方法的標準模式。

二叉樹葉節點總數的迭代演算法
葉節點計數的遞迴演算法非常簡單,迭代演算法也非常簡單。類似於迭代的InOrder遍歷示例,我們使用了一個堆疊來遍歷二叉樹。下面是迭代演算法獲得二叉樹葉節點總數的步驟:
1)如果根為空,則返回零。
2)以零開始計數
3)將根推入堆疊
4)迴圈直到堆疊不為空
5)彈出最後一個節點,推送最後一個節點的左右子節點(如果它們不為空)。
6)增加計數
在迴圈結束時,計數包含葉節點的總數。下面是基於上述邏輯和演算法的示例程式碼:

public int countLeafNodes() {
    if (root == null) {
      return 0;
    }

    Stack stack = new Stack<>();
    stack.push(root);
    int count = 0;

    while (!stack.isEmpty()) {
      TreeNode node = stack.pop();
      if (node.left != null)
        stack.push(node.left);
      if (node.right != null)
        stack.push(node.right);
      if (node.isLeaf())
        count++;
    }

    return count;

  }
}


你可以看到邏輯非常簡單。這個演算法的時間複雜度是O(N),因為您需要訪問二叉樹的所有節點來計算葉節點的總數。堆疊是一個後進先出的資料結構,我們使用了jdk實現java.util.stack,它還擴充套件了vector類。

用Java程式計算二叉樹中葉節點的數量
這是用Java計算給定二叉樹中葉節點總數的完整程式。 該程式演示了遞迴和迭代演算法來解決這個問題。在此程式中,我們將使用以下二叉樹進行測試。

            a
           / \
         b    f
        / \   / \
      c   e  g  h
     /               \ 
   d                 k 

由於此樹中有四個葉節點(D、E、G和K),所以您的程式應該列印4個。CountLeafNodesRecursive()方法使用遞迴解決此問題,CountLeafNodes()不使用遞迴解決此問題。兩種方法前面已作闡述。

import java.util.Stack;

/*
 * Java Program to count all leaf nodes of binary tree 
 * with and without recursion.
 * input : a
 *        / \
 *       b   f
 *      / \  / \
 *     c   e g  h
 *    /         \ 
 *   d           k 
 * 
 * output: 4 
 */


public class Main {

  public static void main(String args) throws Exception {

    // let's create a binary tree
    BinaryTree bt = new BinaryTree();
    bt.root = new BinaryTree.TreeNode("a");
    bt.root.left = new BinaryTree.TreeNode("b");
    bt.root.right = new BinaryTree.TreeNode("f");
    bt.root.left.left = new BinaryTree.TreeNode("c");
    bt.root.left.right = new BinaryTree.TreeNode("e");
    bt.root.left.left.left = new BinaryTree.TreeNode("d");
    bt.root.right.left = new BinaryTree.TreeNode("g");
    bt.root.right.right = new BinaryTree.TreeNode("h");
    bt.root.right.right.right = new BinaryTree.TreeNode("k");

    // count all leaf nodes of binary tree using recursion
    System.out
        .println("total number of leaf nodes of binary tree in Java (recursively)");
    System.out.println(bt.countLeafNodesRecursively());

    // count all leaf nodes of binary tree without recursion
    System.out
        .println("count of leaf nodes of binary tree in Java (iteration)");
    System.out.println(bt.countLeafNodes());

  }

}

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

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

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

  }

  // root of binary tree
  TreeNode root;

  /**
   * Java method to calculate number of leaf node in binary tree.
   * 
   * @param node
   * @return count of leaf nodes.
   */
  public int countLeafNodesRecursively() {
    return countLeaves(root);
  }

  private int countLeaves(TreeNode node) {
    if (node == null)
      return 0;

    if (node.isLeaf()) {
      return 1;
    } else {
      return countLeaves(node.left) + countLeaves(node.right);
    }
  }

  /**
   * Java method to count leaf nodes using iteration
   * 
   * @param root
   * @return number of leaf nodes
   * 
   */
  public int countLeafNodes() {
    if (root == null) {
      return 0;
    }

    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    int count = 0;

    while (!stack.isEmpty()) {
      TreeNode node = stack.pop();
      if (node.left != null)
        stack.push(node.left);
      if (node.right != null)
        stack.push(node.right);
      if (node.isLeaf())
        count++;
    }

    return count;

  }
}

Output
total number of leaf nodes of a binary tree in Java (recursively)
4
count of leaf nodes of a binary tree in Java (iteration)
4


這就是如何用Java計算二叉樹中葉節點的數量。

相關文章