题目
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
思路一:递归
左子树的个数加右子树的个数加1
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
if(!root)
return 0;
return countNodes(root->left)+countNodes(root->right)+1;
}
};
思路二
利用完全二叉树节点数:
2
h
−
1
{2^h-1}
2h−1,h是二叉树高度,降低递归复杂度
比较右子树与树的高度,如果相差1,则说明左子树是满二叉树,总节点数 = 左子树节点数(
2
h
−
1
−
1
{2^{h-1}-1}
2h−1−1)+ 根节点(1)+右子树节点数(递归计算)
如果相差2,说明左子树未满,总节点数 = 右子树节点数(
2
h
−
2
−
1
{2^{h-2}-1}
2h−2−1)+根节点(1)+左子树节点数(递归计算)。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int getHeight(TreeNode* root){
int height = 0;
while(root){
height++;
root = root->left;
}
return height;
}
int countNodes(TreeNode* root) {
if(!root)
return 0;
int height = getHeight(root);
int rightHeight = getHeight(root->right);
if(height == rightHeight + 1) //左子树已满
return (1 << height-1) + countNodes(root->right); //左子树节点数加右子树节点数
else
return countNodes(root->left) + (1 << height-2); //左子树节点数加右子树节点数
}
};
本文介绍两种方法计算完全二叉树的节点数量:递归法和利用完全二叉树特性减少递归深度的方法。前者简单直接,后者通过比较左右子树高度,判断左子树是否满来提高效率。
465

被折叠的 条评论
为什么被折叠?



