题目描述:
主要思路:
利用二分答案的思想进行求解。
首先遍历到最底下的最左结点,然后可以得到一个答案范围,然后二分求解验证即可。
具体细节见代码。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool find(int x,int level,TreeNode* root)
{
int bits=1<<(level-1);
while(root&&bits>0)
{
if(x&bits)
root=root->right;
else
root=root->left;
bits>>=1;
}
return root!=nullptr;
}
int countNodes(TreeNode* root) {
if(!root)
return 0;
int level=0;
TreeNode * node=root;
while(root->left)
{
root=root->left;
level+=1;
}
int l=1<<level,r=(1<<(level+1))-1;
root=node;
while(l<r)
{
int mid=(l+r+1)>>1;
if(find(mid,level,root))
l=mid;
else
r=mid-1;
}
return l;
}
};