[路飞]_leetcode-222-完全二叉树的节点个数

简介: leetcode-222-完全二叉树的节点个数

网络异常,图片无法展示
|


[题目地址][B站地址]


给你一棵 完全二叉树 的根节点 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) 的简单解决方案。你可以设计一个更快的算法吗?


那本题题意也说了,遍历数统计节点数量是一种简单的解决方案,要我们设计一种更快的算法


这里更快的算法是这样的


  1. 因为输入的二叉树是完全二叉树,所以除了最后一层,前面每层的节点数量都是满的
  2. 根据这种性质,假设总层数为 h,则最后一层之前的节点数量为 2h-1 次方减 1
  3. 然后求得最后一层的节点数量相加,即可求得结果值
  4. 最后一层的数量有需要通过二分加判断该节点是否存在的方式获得


而这种更优解的时间复杂度是 O(log2n)


这里我个人观点是时间复杂度虽然是有优化,但是优化程度不高,而整个解题过程却繁琐了很多,所以我还是采取了递归遍历二叉树记录数量的方式解决本题。


大家如果对最优解感兴趣,可以去题解中查看官方题解学习。


遍历二叉树解题代码如下:


var countNodes = function(root) {
  // 创建结果值,初始化为0
  let res = 0;
  // 递归遍历每个节点,记录节点数量
  function getNum(root){
    if(root === null) return;
    res++;
    getNum(root.left);
    getNum(root.right);
  }
  getNum(root);
  // 返回结果值
  return res;
};
复制代码


至此我们就完成了 leetcode-222-完全二叉树的节点个数


如有任何问题或建议,欢迎留言讨论!

相关文章
|
3月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
30 0
LeetCode第二十四题(两两交换链表中的节点)
|
3月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
48 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
3月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
22 0
|
5月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
60 5
|
5月前
|
Python
【Leetcode刷题Python】222. 完全二叉树的节点个数
LeetCode第222题"完全二叉树的节点个数"的Python代码实现,通过递归和深度优先遍历的方法来计算给定完全二叉树的节点总数。
55 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
47 4
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
65 6
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2