[路飞]_完全二叉树的节点个数

245 阅读2分钟

题目介绍

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h 个节点。

示例1

image.png

输入: 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) 的简单解决方案。你可以设计一个更快的算法吗? leetcode-222 完全二叉树的节点个数
    b站视频

解题思路

简单解法是通过递归来遍历二叉树的每一个节点,然后计算整棵树的节点数量,这种方式没有利用完全二叉树的特性,对于每一棵二叉树都可以通过这个方法来遍历出它的节点数

解题代码

var countNodes = function(root) {
    if (!root) return 0
    return countNodes(root.left) + countNodes(root.right) + 1
};

另一种写法是利用了完全二叉树的特性

  • 完全二叉树除了最后一层,其余各层都是满节点
  • 最后一层的节点都在左侧
  • 每一层的第一个节点为 2 ^ n,最后一个节点为 2 ^ (n + 1) - 1

1641577551(1).png 解题步骤是:

  1. 从根节点开始,每次遍历左子节点,统计完全二叉树的层数
  2. 计算最后一层节点的范围
  3. 在最后一层的节点范围中利用二分法查找中间节点是否在最后一层中,如果是,则最后一个节点在中间节点右侧,否则在中间节点左侧