leetcode:222完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 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:题目分析

问题性质:

本问题要求计算给定完全二叉树的节点数。

输入条件:
  • 树的根节点 root
  • 树是完全二叉树(完全二叉树定义见题目)。
输出条件:
  • 返回完全二叉树的节点个数。
限制条件:
  1. 树中节点的范围是 [0, 5 * 10^4]
  2. 节点值范围是 [0, 5 * 10^4]
  3. 完全二叉树性质
    • 除了最底层,其余层的节点数达到最大值。
    • 最底层节点集中在最左侧。
边界条件:
  1. 树为空(root = [])。
  2. 树只有一个节点。
  3. 树的最底层部分节点缺失,但仍满足完全二叉树性质。

步骤2:解题思路

方法1:朴素解法(时间复杂度 O(n))
  • 思想:遍历整个树,统计所有节点数量。
  • 实现方式:使用递归或迭代方式实现树的遍历。
  • 时间复杂度:O(n),因为需要访问每个节点。
  • 缺点:没有利用完全二叉树的性质优化。
方法2:利用完全二叉树性质(时间复杂度 O(log²n))
  • 思想:完全二叉树的性质可以帮助我们快速计算节点个数:
    1. 若树是满二叉树(所有节点都填满),节点总数为 2^h - 1,其中 h 是树的深度。
    2. 如果树不是满二叉树,可以递归地判断左右子树:
      • 通过计算左右子树的高度,判断左子树是否是满二叉树:
        • 若左子树高度等于右子树高度,则左子树为满二叉树,节点数为 2^h - 1
        • 否则,递归到右子树进行计算。
  • 时间复杂度
    • 对于完全二叉树,树的深度为 O(logn),递归每次减少一半的节点。
    • 每次递归需要计算树的高度(O(logn))。
    • 总时间复杂度:O(log²n)。
  • 空间复杂度:O(logn)(递归栈深度)。

步骤3:C++代码实现

代码注释说明:
  1. computeDepth 函数
    • 计算完全二叉树的深度,只需沿着左子树遍历即可,时间复杂度 O(logn)。
  2. countNodes 函数
    • 递归判断左右子树是否为满二叉树。
    • 若是满二叉树,直接通过公式计算节点数量,无需遍历。
    • 若不是,递归到子树继续判断。

步骤4:解决问题的启发

  1. 利用特定数据结构的性质
    • 本题通过完全二叉树的特殊性质大幅优化节点统计效率。设计高效算法时,理解数据结构的特性是关键。
  2. 数学与递归的结合
    • 使用数学公式(满二叉树节点数公式)结合递归分治法,解决问题的效率远高于直接遍历。
  3. 时间复杂度的改进
    • 从 O(n) 优化到 O(log²n),体现了算法优化的重要性。

步骤5:算法在实际生活中的应用

实际应用场景:数据库索引结构

完全二叉树的性质和节点统计方法可用于数据库索引优化

  1. 场景
    • 数据库的 B+ 树索引结构中,节点数量可以通过类似的递归计算方法快速统计。
    • 例如,统计某个范围内的数据条目数量。
  2. 实现方法
    • 利用 B+ 树的分层结构和满二叉树性质,通过计算左子树和右子树的深度快速确定数据范围的节点数量。
实际示例:文件系统节点统计

文件系统中,完全二叉树常用于模拟目录和文件的结构。计算某个子目录下的文件总数时,可以采用类似的递归计算方法,快速得出结果,而无需遍历整个目录结构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子

目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率&#xff0c;联合概率&#xff0c;交叉概率&#xff0c;交叉概率和&#xff0c;总概率 类型含义 …

【前端】ES6基础

1.开发工具 vscode地址 :https://code.visualstudio.com/download, 下载对应系统的版本windows一般都是64位的 安装可以自选目录&#xff0c;也可以使用默认目录 插件&#xff1a; 输入 Chinese&#xff0c;中文插件 安装&#xff1a; open in browser&#xff0c;直接右键文件…

《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全分析器, 开源口袋电源,开源健康测量,FreeCAD

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频&#xff1a; https://www.bilibili.com/video/BV1TYBhYKECK/ 《安富莱嵌入式周报》第346期&#xff1a;开源2GHz带…

《白帽子讲Web安全》13-14章

《白帽子讲Web安全》13-14章 《白帽子讲Web安全》13-14章13、应用层拒绝服务攻击13.1、DDOS简介13.2、应用层DDOS13.2.1、CC攻击13.2.2、限制请求频率13.2.3、道高一尺&#xff0c;魔高一丈 13.3、验证码的那些事儿13.4、防御应用层DDOS13.5、资源耗尽攻击13.5.1、Slowloris攻击…

51单片机从入门到精通:理论与实践指南(一)

单片机在智能控制领域的应用已非常普遍&#xff0c;发展也很迅猛&#xff0c;学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出&#xff0c;但51单片机价格低廉、易学易用、性能成熟&#xff0c;在家电和工业控制中有一定的应用&#xff0c;而且学好了51单片机&…

相亲交友小程序项目介绍

一、项目背景 在当今快节奏的社会生活中&#xff0c;人们忙于工作和事业&#xff0c;社交圈子相对狭窄&#xff0c;寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式&#xff0c;在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

uni-app运行 安卓模拟器 MuMu模拟器

最近公司开发移动端系统&#xff0c;使用真机时每次调试的时候换来换去的麻烦&#xff0c;所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器&#xff0c;如果系统…

mydocker

Docker容器特点 轻量级&#xff1a;在同一台宿主机上的容器共享系统 Kerel &#xff0c;这使得它们可以迅速启动而且占用内存极少。镜像是以分层文件系统构造的&#xff0c;这可以让它们共享相同的文件&#xff0c;使得磁盘使用率和镜像下载速度得到提高。开放&#xff1a;Doc…

JVM详解:垃圾回收机制

java作为大型服务开发的主流语言&#xff0c;其运行会占用大量的内存空间&#xff0c;那么合理的使用有限的服务器资源至关重要。和大多数翻译性语言一样&#xff0c;java的运行环境jvm也内置垃圾回收机制&#xff0c;其通过一些合理的算法组合&#xff0c;定时来对堆中保存的不…

Kali2024.4切换xfce主题输入法失效问题

目前感觉linux下比较好用的输入法就是google pinyin&#xff0c;常规的安装 sudo apt install fcitx im-configsudo apt install fcitx-googlepinyin然而在切换主题后&#xff0c;输入法不好用了&#xff0c;手动添加输入法也是找不到的状态&#xff0c;进入排查步骤&#xff…

C++初阶学习第十三弹——容器适配器和优先级队列的概念

目录 一.容器适配器 1.2deque的原理介绍 1.3deque与vector和list的比较&#xff0c;以及deque的缺陷 1.4为什么选择deque作为stack和queue的底层默认容器&#xff1f; stack的模拟实现 queue的模拟实现 二.优先级队列 2.1priority_queue的使用 三、总结 一.容器适配器 s…

C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)

目录 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 题目截图&#xff1a; 此题所说的…

easyui combobox 只能选择第一个问题解决

easyui combobox 只能选择第一个问题解决 问题现象 在拆分开票的时候&#xff0c;弹出框上面有一个下拉框用于选择需要新增的明细行&#xff0c;但是每次只能选择到第一个 选择第二条数据的时候默认选择到第一个了 代码如下 /*新增发票编辑窗口*/function addTicketDialog…

机器学习周志华学习笔记-第6章<支持向量机>

机器学习周志华学习笔记-第6章<支持向量机> 卷王&#xff0c;请看目录 6支持向量机6.1 函数间隔与几何间隔6.1.1 函数间隔6.1.2 几何间隔 6.2 最大间隔与支持向量6.3 对偶问题6.4 核函数6.5 软间隔支持向量机6.6 支持向量机6.7核方法 6支持向量机 支持向量机是一种经典…

111. UE5 GAS RPG 实现角色技能和场景状态保存到存档

实现角色的技能存档保存和加载 首先&#xff0c;我们在LoadScreenSaveGame.h文件里&#xff0c;增加一个结构体&#xff0c;用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…

ArcGIS pro中的回归分析浅析(加更)关于广义线性回归工具的补充内容

在回归分析浅析中篇的文章中&#xff0c; 有人问了一个问题&#xff1a; 案例里的calls数据貌似离散&#xff0c;更符合泊松模型&#xff0c;为啥不采用泊松而采用高斯呢&#xff1f; 确实&#xff0c;在中篇中写道&#xff1a; 在这个例子中我们为了更好地解释变量&#x…

从 HTML 到 CSS:开启网页样式之旅(二)—— 深入探索 CSS 选择器的奥秘

从 HTML 到 CSS&#xff1a;开启网页样式之旅&#xff08;二&#xff09;—— 深入探索 CSS 选择器的奥秘 前言一、CSS基本选择器1. 通配选择器2. 元素选择器3. 类选择器4. id选择器5.基本选择器总结 二、CSS复合选择器1. 后代选择器2. 子选择器3. 相邻兄弟选择器4.交集选择器5…

【机器学习chp7】SVM

参考1&#xff0c;笔记 SVM笔记.pdf 参考2&#xff1a;王木头视频 什么是SVM&#xff0c;如何理解软间隔&#xff1f;什么是合叶损失函数、铰链损失函数&#xff1f;SVM与感知机横向对比&#xff0c;挖掘机器学习本质_哔哩哔哩_bilibili 目录 一、SVM模型 二、构建决策函…

【C++】读取数量不定的输入数据

读取数量不定的输入数据 似乎是一个很实用的东西&#xff1f; 问题&#xff1a; 我们如何对用户输入的一组数&#xff08;事先不知道具体有多少个数&#xff09;求和&#xff1f; 这需要不断读取数据直至没有新的输入为止。&#xff08;所以我们的代码就是这样设计的&#x…