题目描述:
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/
2 3
/ \ /
4 5 6
输出: 6
解法:
1.递归(常规解法)没有利用到完全二叉树的性质
class Solution {
public int countNodes(TreeNode root) {
if(root==null) return 0;
return countNodes(root.left)+countNodes(root.right)+1;
}
}
2.利用完全二叉树的特性:
1.如果右子树的最左节点的高度rh与整个二叉树的高度h相等,那么左子树为一个满二叉树,整个二叉树的节点个数=左子树(2的rh次方)个数+递归右子树(右子树也是一个完全二叉树)
2.如果右子树的最左节点的高度与整个二叉树的高度h不相等,那么右子树为一个满二叉树,整个二叉树的节点个数=右子树(2的rh次方)个数+递归左子树(左子树也是一个完全二叉树)
class Solution {
public int countNodes(TreeNode root) {
if(root==null) return 0;
//整个子树的高度h
int h = getHigh(root);
//右子树的高度h
int rh = getHigh(root.right);
//节点个数
int count = 0;
//左子树是个满二叉树,递归右子树
if(rh==h-1){
count = (1<<rh) + countNodes(root.right);
}
//右子树是个满二叉树,递归左子树
else{
count = (1<<rh) + countNodes(root.left);
}
return count;
}
public int getHigh(TreeNode root){
if(root==null) return 0;
return getHigh(root.left)+1;
}
}