Leetcode222.完全二叉樹的節點個數 Count Complete Tree Nodes(Java)
阿新 • • 發佈:2020-12-31
Leetcode222.完全二叉樹的節點個數 Count Complete Tree Nodes(Java)
##Binary Search##, ##Tree##
完全二叉樹的節點個數
可直接採用DFS或BFS方法求出總的結點總數
DFS
採用後續遍歷,先計算左右兩子樹的總結點數,考慮到還有未被計算的根節點,返回總結點數 + 1
時間複雜度: O(n)
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
二分搜尋
完全二叉樹:若設二叉樹的深度為k
,除第k
層外,其他各層(1 ~ k - 1
)的結點數都達到最大個數,且第k
層的所有結點都連續集中在最左邊,就是完全二叉樹
滿二叉樹:一顆二叉樹的結點要麼是葉子結點,要麼它有兩個子結點(如果一個二叉樹的層數為k
,且結點總數時(2^k)-1
,則它是滿二叉樹。
對於任意一棵完全二叉樹都可以這樣遞迴
- 該完全二叉樹是滿二叉樹,計算從該樹根節點一直向左和一直向右的高度,當兩高度相等
h
時說明這棵樹是滿二叉樹,則該樹的結點總數為(2^h) - 1
- 該樹不是滿二叉樹,即左右兩高度不相等,此時必定滿足這樣一個性質:該樹根節點的左子樹和右子樹必然有一棵是滿二叉樹
- 左邊是滿二叉樹
- 右邊是滿二叉樹
- 對於左右兩棵子樹,滿二叉樹的結點數可以根據
(2^h) - 1
計算得到,對於非滿二叉樹的完全二叉樹,其結點數可以採用同樣的方式遞迴計算
時間複雜度: O(logn * logn)
每次判斷左右兩邊深度為O(logn),總共需要判斷O(logn)次
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
int x = 1, y = 1;
TreeNode l = root, r = root;
while (l.left != null) {
x ++;
l = l.left;
}
while (r.right != null) {
y ++;
r = r.right;
}
if (x == y) return (1 << x) - 1;
return countNodes(root.left) + countNodes(root.right) + 1;
}
}