LeetCode-222-完全二叉树的节点个数

news2024/11/13 11:00:02

在这里插入图片描述

一:题目描述:

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

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

二:示例与提示

示例 1:

image-20230728150430181

输入:root = [1,2,3,4,5,6]
输出:6

示例 2:

输入:root = []
输出:0

示例 3:

输入:root = [1]
输出:1

提示:

  • 树中节点的数目范围是[0, 5 * 104]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

三:思路

正常遍历求节点个数

  • 使用层次遍历,遍历每一层元素个数求和即可

使用完全二叉树特性和满二叉树节点个数计算公式

  • 完全二叉树,除最后一层可以没有达到满节点,其余节点都是填满整层的
  • 满二叉树节点个数为2 ^ n - 1,n为该节点的深度
  • 那就先判断子树是否为满二叉树,如果是满二叉树可以直接利用公式,通过判断左外侧和右外侧的深度是否相等即可判断是否为满二叉树
  • 如果不是满二叉树,返回父节点左子树的节点个数和右子树节点个数 + 1即可

四:代码

层序遍历求节点个数

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var countNodes = function(root) {
    //层序遍历
    let res = 0
    if(!root) return res
    //队列
    let queue = [root]
    while(queue.length){
        //记录队列的长度
        let length = queue.length
        //记录每一层的临时一维数组
        let curLevel = []
        for(let i = 0; i < length; i++){
            //出队
            let node = queue.shift()
            curLevel.push(node.val)
            //若存在左右子节点入队
            if(node.left) queue.push(node.left)
            if(node.right) queue.push(node.right)

        }
        res += curLevel.length
    }
    return res
};

完全二叉树特性

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var countNodes = function(root) {
    //完全二叉树解法 节点为2^n - 1 n为深度
    if(!root) return 0
    //终止条件
    let leftDepth = 1
    let rightDepth = 1
    //
    let leftNode = root.left
    let rightNode = root.right
    while(leftNode){
        //不断遍历左节点 直到为空
        leftNode = leftNode.left
        //左侧深度++
        leftDepth++
    }
    while(rightNode){
        rightNode = rightNode.right
        rightDepth++
    }
    //判断是否该节点下的子树是否为满二叉树
    if(leftDepth === rightDepth){
        return Math.pow(2, leftDepth) - 1
    }
    //左
    let leftNumber = countNodes(root.left)
    //右
    let rightNumber = countNodes(root.right)
    //中
    return leftNumber + rightNumber + 1
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点餐系统测试报告

文章目录 一、项目介绍项目简介功能介绍 二、测试计划1 功能测试功能测试用例发现的 BUG 和 解决方法注册功能上传图片功能 2 自动化测试3 性能测试 一、项目介绍 项目简介 该项目是一个门店点餐系统&#xff0c;采用前后端分离的方式实现&#xff0c;后端框架是SSM&#xff…

R-并行计算

本文介绍在计算机多核上通过parallel包进行并行计算。 并行计算运算步骤&#xff1a; 加载并行计算包&#xff0c;如library(parallel)。创建几个“workers”,通常一个workers一个核&#xff08;core&#xff09;&#xff1b;这些workers什么都不知道&#xff0c;它们的全局环…

第一次后端复习整理(JVM、Redis、反射)

1. JVM 文章仅为自身笔记 详情查看一篇文章掌握整个JVM&#xff0c;JVM超详细解析&#xff01;&#xff01;&#xff01; 1.1 什么是JVM jvm是Java虚拟机 1.2 Java文件的编译过程 程序员编写代码形成.java文件经过javac编译成.class文件再通过JVM的类加载器进入运行时数据…

Java云电子病历源码:电子病历在线编辑

SaaS模式Java版云HIS系统的子系统云电子病历系统源码&#xff0c;本系统采用前后端分离模式开发和部署&#xff0c;支持电子病历四级。 电子病历系统主要为医院住院部提供医疗记录依据&#xff0c;协助医务人员在医疗活动过程中通过信息化手段生成的文字、图表、图形、数据、影…

华为数通HCIP-EVPN基础

MP-BGP MP-BGP&#xff08;Multiprotocol Extensions for BGP-4&#xff09;在RFC4760中被定义&#xff0c;用于实现BGP-4的扩展以允许BGP携带多种网络层协议&#xff08;例如IPv6、L3VPN、EVPN等&#xff09;。这种扩展有很好的后向兼容性&#xff0c;即一个支持MP-BGP的路由…

Java Swing Mysql实现的电影票订票管理系统

Java swing mysql实现的电影票订票管理系统&#xff0c;主要实现的功能有&#xff1a;用户端&#xff1a;登录注册、查看电影信息、选择影院场次、选座购票、查看自己的影票、评价电影等功能。管理员&#xff1a;登录、电影管理、影院管理、场次管理、影票管理等功能。 需要源…

echarts统计图x轴文字过长,以省略号显示,鼠标经过提示全部内容

效果图如下 主要代码如下&#xff1a; //1.js代码内加入extension方法&#xff0c;chart参数是echarts实例 function extension(chart) {// 注意这里&#xff0c;是以X轴显示内容过长为例&#xff0c;如果是y轴的话&#xff0c;需要把params.componentType xAxis改为yAxis/…

Shell脚本学习-read命令

Shell变量可以直接赋值或者脚本传参的方式&#xff0c;还可以使用echo命令从标准输入中获得&#xff0c;read为bash内置命令。 [rootvm1 ~]# type echo echo is a shell builtin常用参数&#xff1a; -p prompt&#xff1a;设置提示信息&#xff0c;我们看help内容的信息&…

学习笔记|百度文心千帆大模型平台测试及页面交互简易代码

目前百度文心一言的内测资格申请相当拉胯&#xff0c;提交申请快3个月&#xff0c;无任何音讯。不知道要等到什么时候。 百度适时开放了百度文心千帆大模型平台&#xff0c;目前可以提交申请测试&#xff0c;貌似通过的很快&#xff0c;已取得测试申请资格&#xff0c;可以用起…

产品经理如何平衡用户体验与商业价值?

近期负责前端产品设计工作的小李忍不住抱怨&#xff1a;公司总是要求客户第一&#xff0c;实现客户良好体验&#xff0c;但在实际操作过程中&#xff0c;面向用户 体验提升的需求&#xff0c;研发资源计划几乎很难排上&#xff0c;资源都放在公司根据业务价值排序的需求…

MySQL笔记——表的分组查询、表的分页查询、表的约束、数据库设计

系列文章目录 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 MySQL笔记——表的修改查询相关的命令操作 MySQL案例——多表查询以及嵌套查询​​​​​​ MySQL笔记——数据库当…

室外高精度人员定位系统解决方案:实现安全与效率的完美平衡

在如今高度竞争的商业环境中&#xff0c;室外高精度人员定位系统已成为许多行业提高安全性和效率的关键工具。 对此&#xff0c;华安联大推出室外高精度人员定位系统解决方案&#xff0c;该方案通过融合多种定位技术和优化算法&#xff0c;实现高精度定位&#xff0c;并通过真…

【Docker】Docker容器与虚拟机的对比、三要素、架构和镜像加速器的详细讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

亚马逊建议卖家使用“客户评论”选项卡提高产品评级!

亚马逊美国站发布公告称客户评论见解选项卡通过分析评论来帮助卖家推出评价较高的产品&#xff0c;以更好地了解客户偏好和当前趋势&#xff0c;从而提高产品评级&#xff0c;以下是公告内容&#xff1a; 客户评论见解选项卡通过分析评论来帮助卖家推出评价较高的产品&#xf…

一份百万收藏的《从零开始写分布式服务框架》称霸Github榜首!

前言 架构说简单点就是一堆技术、框架、工具的组合&#xff0c;至于怎么组合&#xff0c;这就非常考验架构师的经验和水平。一个优秀的架构&#xff0c;可以让开发效率变得更加高效&#xff0c;为企业节省更多的成本。程序员可将自己更多的精力放在业务需求的实现上&#xff0…

Redis 集群部署

Redis 3.0 版本后正式推出 Redis 集群模式,该模式是 Redis 的分布式的解决方案,是一个提供在多个 Redis 节点间共享数据的程序集,且 Redis 集群是去中心化的,它的每个 Master 节点都可以进行读写数据,每个节点都拥有平等的关系,每个节点都保持各自的数据和整个集群的状态…

基于YOLOv8开发构建蝴蝶目标检测识别系统

在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…

【高压架构】AP5199S LED平均电流型恒流驱动IC 0.01调光 景观舞台汽车灯驱动照明

说明 AP5199S 是一款外围电路简单的多功能平均电流型 LED 恒流驱动器&#xff0c;适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片 PWM 端口支持超小占空比的 PWM 调光&#xff0c;可响应 60ns 脉宽。为客户提供解决方案&#xff0c;限度地发挥灯具优势&#xff0c;…

Betaflight飞控之FAILSAFE机制

Betaflight飞控之FAILSAFE机制 1. 源由2. 设计2.1 触发方式2.1.1 遥控开关触发2.1.2 遥控信号丢失 2.2 FAILSAFE策略2.2.1 Drop mode2.2.2 Landing mode2.2.3 GPS Return mode 3. GPS救援状态机4. 总结5. 参考资料 1. 源由 之前对航模飞控之FAILSAFE机制做了一个简单的探讨&am…

【JavaEE初阶】——第七节.Servlet入门学习笔记

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;JavaEE进阶 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录 前…