难度中等
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
思路一:
最简单直接的方式就是采用递归的方式遍历每一个节点统计全部的节点数量。
int countNodes(TreeNode* root) {
if(root == NULL) return 0;
return countNodes(root->left)+countNodes(root->right)+1;
}
思路二:
考虑到完全二叉树的结构:
针对任意节点:
- 若是该节点左侧的深度等于右侧深度——左侧的子树的满的完全二叉树,右侧的子树是不全满的完全二叉树;
- 若是改节点左侧的深度不等于右侧的深度——左侧的子树是不全满的完全二叉树,右侧的子树是满的完全二叉树
int countNodes(TreeNode* root) {
if(root==NULL) return 0;
int left=deep(root->left);
int right=deep(root->right);
if(left==right)
return countNodes(root->right) + (1<<left);
return countNodes(root->left) + (1<<right);
}
int deep(TreeNode* node){
int num=0;
while(node!=NULL){
num++;
node=node->left;
}
return num;
}