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

290 阅读2分钟

[题目地址] [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-完全二叉树的节点个数

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