- 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1
提示:
树中节点的数目范围是[0, 5 * 104]
0 <= Node.val <= 5 * 104
题目数据保证输入的树是 完全二叉树
进阶:遍历树来统计节点是一种时间复杂度为 O(n) 的简单解决方案。你可以设计一个更快的算法吗?
通过次数169,539提交次数213,452
//递归方法
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr)return 0;
if(!root->left&&!root->right)return 1;
int count=0;
if(!root->left&&root->right) return count = countNodes(root->left)+1;
int a = countNodes(root->left);
int b = countNodes(root->right);
return count = a+b+1;
}
};
//层次遍历
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr)return 0;
queue<TreeNode*>qu;
qu.push(root);
int sum = 0;
while(!qu.empty())
{
int size = qu.size();
sum+=size;
for(int i=0;i<size;i++)
{
TreeNode* Node = qu.front();
qu.pop();
if(Node->left)qu.push(Node->left);
if(Node->right)qu.push(Node->right);
}
}
return sum;
}
};
//使用栈的层次遍历
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr)return 0;
stack<TreeNode*>qu;
qu.push(root);
int sum = 0;
while(!qu.empty())
{
int size = qu.size();
sum+=size;
for(int i=0;i<size;i++)
{
TreeNode* Node = qu.top();
qu.pop();
if(Node->left)qu.push(Node->left);
if(Node->right)qu.push(Node->right);
}
}
return sum ;
}
};
//递归,其实也就是将节点单独拿出来进行处理
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr)return 0;
int leftdepth = 0;
int rightdepth = 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int count = 0;
while(left)
{
left = left->left;
leftdepth++;
}
while(right)
{
right=right->right;
rightdepth++;
}
if(leftdepth==rightdepth)
{
count = (2<<leftdepth)-1;
}
else
{
int a = countNodes(root->left);
int b = countNodes(root->right);
count = a+b+1;
}
return count;
}
};