给出一个完全二叉树,求出该树的节点个数。
完全二叉树的定义如下:
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含1~ 2h 个节点。
这道题直接遍历做是会超时的,还是要找规律:完全满二叉树的节点=2^level - 1
- 先判断根节点开始是不是完全满二叉树,如果是,可以直接通过树的层数level直接计算
- 如果不是,那么分别计算root的左右节点,重复上一步,直到子树是完全满二叉树,就可以直接计算
- 判断树是不是完全满二叉树,通过一直往左遍历和一直往右遍历,得到的两个层数相同就是完全满二叉树
提高效率的两个地方:
- 求2^level - 1不要用pow函数。直接用(1﹤﹤level) -1,数字1左移level位,就是2^level
- 求树两条边的层数时用while即可,递归会慢一些
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
return isBalance(root);
}
public int isBalance(TreeNode root){
int leftLevel = findLeftLevel(root);
int rightLevel = findRightLevel(root);
if(leftLevel == rightLevel){
return (1 << leftLevel) - 1;
}
else{
return 1+isBalance(root.left) + isBalance(root.right);
}
}
public int findLeftLevel(TreeNode root) {
int level = 0;
while(root != null){
root = root.left;
level++;
}
return level;
}
public int findRightLevel(TreeNode root) {
int level = 0;
while(root != null){
root = root.right;
level++;
}
return level;
}
}