力扣222.完全二叉树的节点个数

简介: 力扣222.完全二叉树的节点个数

完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 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;
    }
};
目录
相关文章
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
21 0
|
4月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
4月前
|
Python
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
48 4
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
55 5
|
4月前
|
Python
【Leetcode刷题Python】222. 完全二叉树的节点个数
LeetCode第222题"完全二叉树的节点个数"的Python代码实现,通过递归和深度优先遍历的方法来计算给定完全二叉树的节点总数。
50 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
|
6月前
|
算法 数据可视化 数据挖掘
哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和
哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和
|
6月前
|
存储 SQL 算法
LeetCode 题目 117:填充每个节点的下一个右侧节点指针 II
LeetCode 题目 117:填充每个节点的下一个右侧节点指针 II