題目
給出一個完全二叉樹,求出該樹的節點個數。
說明:
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其余每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1~ 2^h 個節點。
思路
1.如果一棵二叉樹是完全二叉樹,那么二叉樹最大深度和右子樹的最大深度是相同的話,那么根節點的左子樹一定是一棵滿二叉樹,利用公式即可求出根節點的左子樹的節點加上根節點的節點數量。
2.如果一棵二叉樹是完全二叉樹,那么二叉樹最大深度和右子樹的最大深度是不同的話(實際情況就是二叉樹的最大深度比其右子樹的最大深度大1),那么右子樹一定是深度 為二叉樹深度減2的滿二叉樹。
由上述內容可知,一棵完全二叉樹左右子樹中至少一個是滿二叉樹。
題解
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//https://www.jianshu.com/p/62db7c855e44
class Solution {
private:
int height(TreeNode* root){
if(root == NULL)
return -1;
while(root != NULL)
return height(root->left) + 1;
}
public:
int countNodes(TreeNode* root) {
int h=height(root);
int nums=0;
while(root!=NULL){
if(h-1==height(root->right)){
nums+=1<<h; //相當於pow(2,h - 1)
root=root->right;
}
else{
nums+=1<<h-1;
root=root->left;
}
h--;
}
return nums;
}
};
reference