给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到
最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包
含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
方法一:直接遍历所有节点,没有用到完全二叉树的特性
/**
* 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 countNodes(root.left) + countNodes(root.right) + 1;
}
}
方法二:通过比较左右子树的高度,
若左子树高度等于右子树,代表左子树满,个数为2^left - 1,加上根为2^left个,右子树递归这个过程,
若左子树高于右子树,代表右子树满,同理。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int countLevel(TreeNode root){
int level = 0;
while(root != null){
level++;
root = root.left;
}
return level;
}
public int countNodes(TreeNode root) {
if(root == null) return 0;
int left = countLevel(root.left);
int right = countLevel(root.right);
if(left == right){
return countNodes(root.right) + (1 << left);
}
else{
return countNodes(root.left) + (1 << right);
}
}
}