1.最容易想到的方法:递归遍历每个点,计算出总的点数,时间复杂度O(n),很不幸,超时了。(不超也说不过去啊==)
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL)
return 0;
int res=0;
if(root->left)
res+=countNodes(root->left);
if(root->right)
res+=countNodes(root->right);
return res+1;
}
};
2. 我们要充分利用完全二叉树的性质,本来想利用规律,这样只用求得最后一层的结点数即可,但是不好实现。于是我们把问题放到全局,在什么情况下可以利用完全二叉树这个性质利用等比数列的和直接求出呢?显然,是左右子树高度相等时。因此,我们也找到了递归终止的条件,问题解决,复杂度O(logN)。
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL)
return 0;
int lno=0,rno=0;
TreeNode *l=root,*r=root;
while(l->left)
{
lno++;
l=l->left;
}
while(r->right)
{
rno++;
r=r->right;
}
if(lno==rno)
return pow(2.0,lno+1)-1;
return 1+countNodes(root->left)+countNodes(root->right);
}
};