题意:计算一个完全二叉树的节点个数
题解:DFS 或者BFS都太low,我们可以用O(log(n)^2)的效率解决,n为节点个数,log(n)就是树的高度。
我们首先获得数的高度,然后,二分去寻找,最后一层的最右边的一个节点,就能计算树的节点个数了。
二分是Log(n),DFS也是Log(n),在DFS的时候我们用位运算来决定向左还是向右。因为二叉树的叶子可以看做二进制数,从根节点开始,向左是0,向右是1,所以二分就是二分叶子节点代表都二进制数。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL)
return 0;
int h=0;
GetHeight(root,h);
if(h==0)
return 1;
int l =0;
int r = (1<<h)-1;
while(l<=r)
{
int mid = (l+r)/2;
if(DFS(root,mid,1<<(h-1)))
{
l = mid+1;
}
else
{
r = mid-1;
}
}
return (1<<h)+r;
}
void GetHeight(TreeNode* root,int& h)
{
if(root->left!=NULL)
{
GetHeight(root->left,++h);
}
}
int DFS(TreeNode* root,int x,int y)
{
if(y==0)
return 1;
if(x&y)
{
if(root->right==NULL)
return 0;
else
return DFS(root->right,x,y>>1);
}
else
{
if(root->left==NULL)
return 0;
else
return DFS(root->left,x,y>>1);
}
}
};