题目链接:
题目描述:
求一个完全二叉树的节点个数。
题目分析:
需要注意的是遍历的方式求解节点个数会超时,时间复杂度为O(n)。利用完全二叉树与满二叉树节点个数的特性。满二叉树的节点个数为2^h-1,h为树高。先判断该完全二叉树是不是满二叉树,如果是直接返回结果,如果不是再递归求解。
如果节点左子树最左边的深度,与节点右子树最右边的深度相等,则以该节点为根节点的树是满二叉树,如果不等,则以该节点为根节点的树的节点个数=其左子树的节点个数+其右子树的节点个数+本身。
代码:
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL){
return 0;
}
int leftHgt=1;
int rightHgt=1;
TreeNode* ptr=NULL;
ptr=root->left;
while(ptr!=NULL){
leftHgt++;
ptr=ptr->left;
}
ptr=root->right;
while(ptr!=NULL){
rightHgt++;
ptr=ptr->right;
}
if(leftHgt==rightHgt){
return (1<<leftHgt)-1;
}
else{
return countNodes(root->left)+countNodes(root->right)+1;
}
}
};