给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
方法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 == nullptr)
return 0;
int idx=1;
list<TreeNode*> ls;
ls.push_back(root);
while(ls.size() != 0)
{
nRes++;
TreeNode* node = ls.back();
ls.pop_front();
if(node->right) ls.push_back(node->right);
}
return nRes;
int idx=1;
TreeTravel(root,idx);
return idx;
}
}
方法2:
根据完全二叉树的性质,连续的节点。
如果左子树的高度与右子树的高度一致,则最后一个节点在右子树上,则左子树是满二叉树,有个数的性质,2^depth-1
如果左子树的高度与右子树的高度不一致,即左子树的高度大于右子树高度,则最后一个节点在左子树上,则右子树为满二叉树,有个数的性质,2^depth-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) {
return GetTreeNodeNums(root);
}
int GetTreeNodeNums(TreeNode* root)
{
//递归终止条件
if(root == nullptr)
return 0;
//计算左子树的高度
int leftHeight = GetTreeHeight(root->left);
//计算右子树的高度
int rightHeight = GetTreeHeight(root->right);
//比较左右子树的高度
if(leftHeight == rightHeight)
{
//说明最底层的最后一个节点在右子树上,左子树是满的
//返回左子树的个数+右子树的个数+1(根节点)
return GetTreeNodeNums(root->right) + (1<<leftHeight)-1 + 1;
}
else
{
//说明最底层的最后一个节点在左子树上,右子树是满的
//返回左子树的个数+右子树的个数+1(根节点)
return GetTreeNodeNums(root->left) + (1<<rightHeight)-1 + 1;
}
}
int GetTreeHeight(TreeNode* root)
{
int height=0;
TreeNode* node = root;
while(node != nullptr)
{
height++;
node = node->left;
}
return height;
}
};