給定一棵完全二叉樹的根節點root,返回這棵樹的節點個數。如果完全二叉樹的節點數爲N,請實現時間複雜度低於O(N)的解法。給定樹的根結點root,請返回樹的大小。
二分的思想。看完全二叉樹的最後的最右一個節點的位置
思路:
1 找到完全二叉樹的最左節點,也就是求左子樹的深度
2 找到完全二叉樹頭節點右子樹中的最左節點,記錄右子樹深度
3 如果兩個深度相等,說明頭節點左子樹是一棵滿二叉樹,使用公式求得長度再加上頭節點,然後對於右子樹使用遞歸求解
4 如果左子樹深度大於右子樹深度,說明右子樹是一棵完全二叉樹,使用公式求得長度再加上頭節點,然後對於左子樹使用遞歸求解.
public int count(TreeNode root) {
if(root==null) return 0;
int count = 0;
TreeNode cur = root.left;
//記錄左子樹的深度
int ldepth = 0;
while(cur!=null) {
ldepth++;
cur = cur.left;
}
cur = root.right;
//記錄右子樹深度
int rdepth = 0;
while(cur!=null) {
rdepth++;
cur = cur.right;
}
//如果ldepth==rdepth,則說明左子樹是滿二叉樹,可用公式求解
if(ldepth==rdepth) {
//這裏不用減一,因爲把根節點算進去了
count = (int)Math.pow(2, ldepth)+count(root.right);
} else { //此時ldepth>rdepth,則說明右子樹是一棵滿二叉樹
count = (int)Math.pow(2, rdepth) + count(root.left);
}
return count;
}