给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/
2 3
/ \ /
4 5 6
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int deep=-1;
public int countNodes(TreeNode root) {
dfs(root);
if(deep==0) return 1;
int l=1,r=(int)Math.pow(2,deep);
int num=r;
while(l<=r){//二分枚举最后一层的结点个数
int mid=(l+r)>>1;
if(judge(root,mid,num)) l=mid+1;
else r=mid-1;
}
return (int)(Math.pow(2,deep)-1+l-1);
}
void dfs(TreeNode tr){//求深度
if(tr==null) return ;
deep++;
dfs(tr.left);
}
boolean judge(TreeNode tr,int id,int num){//判断能否找到这个结点
if(num==1) return true;
if(id<=num/2&&tr.left!=null) return judge(tr.left,id,num/2);
else if(id>num/2&&tr.right!=null) return judge(tr.right,id-(num/2),num/2);
else return false;
}
}