15_完全二叉树的节点个数

简介: 15_完全二叉树的节点个数

完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 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
  • 题目数据保证输入的树是 完全二叉树

法一:递归法

1、确定递归函数的参数返回值:参数就是传入树的根节点返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。

int getNodesNum(TreeNode root)

2、确定终止条件:如果为空节点的话,就返回0,表示节点数为0。

if (cur == null)  return 0;

3、确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一(加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。

int leftNum = getNodesNum(cur.left);    //左
int rightNum = getNodesNum(cur.right);  //右
int treeNum = leftNum + rightNum + 1;   //中

时间复杂度:O(n)

空间复杂度:O(logn),算上了递归系统栈占用的空间

class Solution {
  //通用递归解法
  public int countNodes(TreeNode root) {
    if (root == null) {
      return 0;
    }
    return 1 + countNode(root.left) + countNode(root.right);
  }
}

法二:迭代法

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null)  return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int count = 1;
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            while (levelSize-- > 0) {
                TreeNode temp = queue.poll();
                if (temp.left != null) {
                    queue.add(temp.left);
                    count++;
                }
                if (temp.right != null) {
                    queue.add(temp.right);
                    count++;
                }
            }
        }
        return count;
    }
}

法三:完全二叉树的特性

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

class Solution {
  /
        针对完全二叉树的解法,满二叉树的节点数为:2^depth - 1
    */
    public int countNodes(TreeNode root) {
        if (root == null)  return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 0, rightDepth = 0;//这里初始化为0是有目的的,为了下面求指数方便
        while (left != null) {  //求左子树的深度
            left = left.left;
            leftDepth++;
        }
        while (right != null) {
            right = right.right;
            rightDepth++;
        }
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1;  // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
相关文章
|
资源调度 JavaScript
nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
8031 2
|
分布式计算 Java Hadoop
解决Hbase启动报错问题:No such file or directory!
应用场景 在Hbase搭建完之后,本想开开心心的启动Hbase,进行测试使用hbase,但是发现启动hbase的时候,报各种各样的错误,java_home,hbase,hadoop等找不到文件或目录,no such ...
4070 0
|
10月前
|
Ubuntu 网络安全 容器
KubeSphere 是一个开源的容器平台,提供丰富的功能和便捷的操作界面,适用于企业容器化部署和管理
KubeSphere 是一个开源的容器平台,提供丰富的功能和便捷的操作界面,适用于企业容器化部署和管理。本文详细介绍了如何在 Ubuntu 22.04 上安装 KubeSphere,包括系统要求、安装依赖项、设置防火墙、下载安装脚本、选择安装选项、验证安装结果等步骤,并提供了常见问题的解决方法。希望本文能为读者提供实用的参考和帮助。
239 3
|
11月前
|
存储 人工智能 运维
阿里云向量检索服务 Milvus 版正式商业化
阿里云向量检索服务 Milvus 版正式商业化!
|
大数据 数据挖掘
【BetterBench】2024年都有哪些数学建模竞赛和大数据竞赛?
本文提供了2024年全年的数学建模和大数据竞赛时间表,列出了32个重要竞赛的报名时间、比赛时间、费用及报名地址等详细信息。
725 6
【BetterBench】2024年都有哪些数学建模竞赛和大数据竞赛?
|
11月前
|
SQL 数据处理 数据库
SQL语句优化与查询结果优化:提升数据库性能的实战技巧
在数据库管理和应用中,SQL语句的编写和查询结果的优化是提升数据库性能的关键环节
1079 0
|
12月前
|
缓存 NoSQL 关系型数据库
|
12月前
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
12月前
|
存储 索引 Python
python中的数据容器
python中的数据容器
|
12月前
|
存储 SQL 缓存