网络异常,图片无法展示
|
给你一棵 完全二叉树 的根节点 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)
的简单解决方案。你可以设计一个更快的算法吗?
那本题题意也说了,遍历数统计节点数量是一种简单的解决方案,要我们设计一种更快的算法
这里更快的算法是这样的
- 因为输入的二叉树是完全二叉树,所以除了最后一层,前面每层的节点数量都是满的
- 根据这种性质,假设总层数为
h
,则最后一层之前的节点数量为2
的h-1
次方减1
- 然后求得最后一层的节点数量相加,即可求得结果值
- 最后一层的数量有需要通过二分加判断该节点是否存在的方式获得
而这种更优解的时间复杂度是 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-完全二叉树的节点个数
如有任何问题或建议,欢迎留言讨论!