222. 完全二叉树的节点个数
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
根据完全二叉树的节点序号,查找该节点
(1)mkroute得到该节点的路径;
(2)havenode从root沿着路径到该节点查看是否为none;
(3)二分法得到不为none的最后一个节点;
/**
* 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) return 0;
int cnt=0;
TreeNode *tmp=root;
while(tmp){
cnt++;
tmp=tmp->left;
}
//cnt为最下层数
//节点个数为
int left=1;
for(int i=1;i<cnt;i++) left*=2;
int right=1;
for(int i=0;i<cnt;i++) right*=2;
right--;
//最少为1个,最多为right个
while(left<right){
int mid=left+(right-left+1)/2;
vector<int> route=mkroute(mid);
if(havenode(root,route)) left=mid;
else right=mid-1;
}
return left;
}
private:
bool havenode(TreeNode*root, vector<int> route)
{
int i=0;
while(root&&i<route.size()){
if(route[i]) root=root->right;
else root=root->left;
i++;
}
if(root) return true;
else return false;
}
vector<int> mkroute(int num){
vector<int> tmp;
while(num>1){
tmp.push_back(num%2);
num/=2;
}
reverse(tmp.begin(),tmp.end());
return tmp;
}
};