Problem:
Given a complete binary tree, count the number of nodes.
Explanation:
计算完全二叉树的结点数量。
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
My Thinking:
直接递归计算树的结点数(虽然通过了,但是网上说应该是超时的?喵喵喵?)
My Solution:
class Solution {
public int countNodes(TreeNode root) {
if(root==null)
return 0;
return countNodes(root.left)+countNodes(root.right)+1;
}
}
Optimum Thinking:
首先通过一直向左遍历计算树的高度,如果高度>0,即有结点,那么计算其右子树的高度,如果该高度等于总高度(左子树的高度)-1,那么这个高度的以上的树是满二叉树,即结点数是2^h-1,(1 << h表示1乘以2的h次方)。
Optimum Solution:
class Solution {
public int height(TreeNode root) {
if(root==null)
return -1;
return 1 + height(root.left);
}
public int countNodes(TreeNode root) {
int h = height(root);//计算树的高度
if(h < 0)
return 0;
else{
if(height(root.right) == h-1)
return (1 << h) + countNodes(root.right);
else
return (1 << h-1) + countNodes(root.left);
}
}
}