題目
給出一個徹底二叉樹,求出該樹的節點個數。
說明:
徹底二叉樹的定義以下:在徹底二叉樹中,除了最底層節點可能沒填滿外,其他每層節點數都達到最大值,而且最下面一層的節點都集中在該層最左邊的若干位置。若最底層爲第 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