如何計算二叉樹中葉節點的數量 - Java迭代和遞迴演算法
二叉樹葉節點總數的遞迴演算法
計算葉節點總數的演算法與關於列印葉節點的問題非常相似。 以下是要遵循的實際步驟:
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計算二叉樹中葉節點的數量。
相關文章
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 二叉樹節點個數,葉子個數,第K層個數,最低公共節點二叉樹
- 為什麼二叉樹中葉子節點個數等於度為2的節點個數+1二叉樹
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 樹2-二叉樹複製, 遍歷, 計算葉子結點和高度二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- Java中在二叉搜尋樹中查詢節點的父節點Java
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 利用非遞迴演算法來搜尋二叉樹中的某個元素java遞迴演算法二叉樹Java
- 二叉樹的遞迴套路二叉樹遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 如何計算PHP函式中傳遞的引數數量PHP函式
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- MySQL遞迴查詢樹狀表的子節點、父節點MySql遞迴
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 遞迴求解二叉樹任意一結點的深度遞迴二叉樹
- 二叉樹的非遞迴遍歷——java實現二叉樹遞迴Java
- 二叉樹遞迴練習二叉樹遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 計算二叉樹的層數二叉樹
- 二叉樹葉子個數二叉樹
- 樹,計算父節點的值
- Java演算法面試題(001) 如何使用迴圈和遞迴計算單連結串列的長度Java演算法面試題遞迴
- python中的迭代與遞迴Python遞迴
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 快速求完全二叉樹的節點個數二叉樹
- 二叉樹非遞迴遍歷二叉樹遞迴
- Java不用遞迴的迭代快速排序示例Java遞迴排序