Given a complete binary tree, count the number of nodes.
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2hnodes inclusive at the last level h.
class Solution {
public:
int countNodes(TreeNode* root) {
if(!root) return 0;
if((level = getLevel(root)) == 0) return 1;
int l = (1 << level) - 1, r = (1 << (level + 1)) - 2;
int base = l;
while(l < r - 1){
int mid = (l + r) / 2;
if(exist(root, mid - base))
l = mid;
else
r = mid - 1;
}
if(r == l + 1 && exist(root, r - base))
++l;
return l + 1;
}
private:
int getLevel(TreeNode *root){
int ret = -1;
while(root){
++ret;
root = root->left;
}
return ret;
}
bool exist(TreeNode *root, int num){
int k = level - 1;
while(k >= 0){
if(num & (1 << k))
root = root->right;
else
root = root->left;
if(!root) return false;
--k;
}
return true;
}
int level;
};