Q
二叉樹中的樹葉數
3
A
回答
4
不同遍歷方法會導致不同的算法(儘管對於這樣一個簡單的問題,所有的變體DFS或多或少相同)。
我假設你有一個BST,它由Node
類型的對象組成。節點具有類型爲Node
的left
和right
兩個字段,它們是節點的子節點。如果孩子不在場,該字段的值爲null
。整棵樹被引用到根,稱爲root
。在Java:
class Node {
public Node left;
public Node right;
}
Node root;
甲DFS是最容易通過遞歸來實現:定義一個方法
int numberOfLeafs(Node node)
它返回由node
根的子樹的葉子的數量。當然,numberOfLeafs(root)
應該產生整棵樹的葉子數量。
至於說,真的是人工在這裏區分會前,會和後序遍歷,但是我會做吧:
預購DFS:先處理當前節點,然後與孩子
int numberOfLeafs(Node node) {
int result = 0;
if (node.left == null && node.right == null)
result += 1;
if (node.left != null)
result += numberOfLeafs(node.left)
if (node.right != null)
result += numberOfLeafs(node.right)
return result;
}
按序DFS:先處理左邊的孩子,然後與當前節點,然後用右子
int numberOfLeafs(Node node) {
int result = 0;
if (node.left != null)
result += numberOfLeafs(node.left)
if (node.left == null && node.right == null)
result += 1;
if (node.right != null)
result += numberOfLeafs(node.right)
return result;
}
後才能DFS:先處理子女,則與當前節點
int numberOfLeafs(Node node) {
int result = 0;
if (node.left != null)
result += numberOfLeafs(node.left)
if (node.right != null)
result += numberOfLeafs(node.right)
if (node.left == null && node.right == null)
result += 1;
return result;
}
對於BFS,通常使用一個簡單的循環,在其中添加一個隊列未訪問的頂點。我現在假設我有一個類Queue
來,我可以在年底add
節點和從前面take
節點:
Queue queue = new Queue();
queue.add(root);
int numberOfLeafs = 0;
while (!queue.empty) {
// take an unhandled node from the queue
Node node = queue.take();
if (node.left == null && node.right == null)
numberOfLeafs += 1;
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
}
+0
伴侶!我讀過這麼多書並觀看在線教程。這是迄今爲止我所遇到過的最好的逆轉BST的最好解釋!非常感謝! – Has
6
使用遞歸方法:
- 對於葉回報1.
- 對於非葉,恢復應用到它的孩子,方法的總和。
實施例在PHP:
class BST {
public $left; // The substree containing the smaller entries
public $right; // The substree containing the larger entries
public $data; // The value that is stored in the node
}
function countLeafs(BST $b) {
// Test whether children exist ...
if ($b->left || $b->right) {
// ... yes, the left or the right child exists. It's not a leaf.
// Return the sum of calling countLeafs() on all children.
return ($b->left ? countLeafs($b->left) : 0)
+ ($b->right ? countLeafs($b->right) : 0);
} else {
// ... no, it's a leaf
return 1;
}
}
0
試試這個
int countLeafNodes(BTNode node) {
if (node == null)
return 0;
if (node.getLeftChild() == null && node.getRightChild() == null
&& node.getParent() != null)//this is a leaf, no left or right child
return 1;
else
return countLeafNodes(node.getLeftChild())
+ countLeafNodes(node.getRightChild());
}
該遞歸計數葉節點的左邊和右邊子樹和返回總計數
相關問題
- 1. 二叉樹葉
- 2. 二叉樹計數葉數
- 3. 樹葉上的二叉樹深度
- 4. 嚴格二叉樹中的樹葉數量
- 5. 在二叉樹的葉節點的
- 6. L葉節點的二叉樹高度
- 7. 如何找到二叉樹的葉子?
- 8. 如何刪除二叉樹的葉子?
- 9. 在Ada的二叉樹中尋找樹葉
- 10. 從二叉樹刪除葉子
- 11. 二叉樹中最大的二叉樹搜索樹
- 12. 二叉樹 - 哪一種二叉樹
- 13. 二叉樹到二叉搜索樹(BST)
- 14. 計算二叉樹中的節點數和葉節點數
- 15. 通過二叉搜索樹遍歷來查找所有樹葉
- 16. 給定級別的二叉樹中的葉節點數量?
- 17. 二叉搜索樹中的葉子數量
- 18. 檢查二叉樹是否爲二叉搜索樹的函數?
- 19. 二叉樹 - 打印葉到葉的路徑[C]
- 20. 二叉樹findHeight
- 21. balanced()二叉樹
- 22. 二叉樹
- 23. 二叉樹
- 24. JAVA:二叉樹
- 25. 二叉樹
- 26. 二叉樹
- 27. 非二叉樹
- 28. Python二叉樹
- 29. 二叉樹值
- 30. OpenMP - 二叉樹
使用遞歸方法:對於葉返回1,對於非葉,返回應用於其子級的該方法的總和。 –
使用您列出的任何遍歷(預先訂購DFS,後期DFS,BFS),並測試您當前訪問的節點是否沒有子節點。如果是這樣,請將計數器增加1. –
謝謝! 是否有一個基本的實現,你會推薦PLZ? – Has