c++数据结构8——二叉树的性质
一、二叉树的基本性质
示图1:
性质1:层节点数上限
在一棵二叉树中,第i层至多有2^{i-1}个节点(首层是第1层)
这个性质可以通过数学归纳法证明:
-
第1层:2^{1-1}=2^0=1个节点(根节点)
-
第2层:2^{2-1}=2^1=2个节点
-
第3层:2^{3-1}=2^2=4个节点
-
...
-
第k层:2^{k-1}个节点
例:示图1的第三层最多有4个节点。
性质2:总结点数上限
深度为k的二叉树至多有2^k-1个节点
这是对性质1的求和结果:
S = 2^0 + 2^1 + 2^2 + ... + 2^{k-1} = 2^k - 1
例:示图1深度为4的二叉树最多有2^4-1=15个节点
性质3:叶子节点与度为2节点的关系
对任意二叉树,叶子节点数n_0和度为2的节点数n_2满足:n_0 = n_2 + 1
证明:
设:
-
n:总结点数
-
n_0:叶子节点数(度为0)
-
n_1:度为1的节点数
-
n_2:度为2的节点数
则有:
-
n = n_0 + n_1 + n_2(节点分类)
-
从边的角度:树的总边数= n - 1
-
这些边由度为1和度为2的节点产生:n - 1 = n_1 + 2n_2
联立两个方程:
n_0 + n_1 + n_2 = n_1 + 2n_2 + 1
简化得:
n_0 = n_2 + 1
练习:
已知一棵二叉树有10个节点,则其中至多有( )个节点有2个子节点
A. 4 B. 5 C. 6 D. 7
解答:
n = n_0 + n_1 + n_2 = 10
由性质3:n_0 = n_2 + 1
代入得:(n_2 + 1) + n_1 + n_2 = 10 → 2n_2 + n_1 = 9
要使n_2最大,则n_1应最小,且n_1必须是奇数(因为2n_2是偶数,9是奇数)
取n_1 = 1,则2n_2 = 8,$n_2 = 4
答案为A
二、特殊二叉树及其性质
1. 满二叉树
定义:每一层的节点数都达到最大值的二叉树
特点:
-
深度为k的满二叉树有2^k-1个节点
-
所有叶子节点都在最底层
编号性质(按层序编号,根节点为1):
-
节点i的父节点编号: i/2
-
节点i的左孩子编号:2i
-
节点i的右孩子编号:2i+1
示图:
2. 完全二叉树
示图:
定义:如果有个二叉树(右边),按照从上到下从左到右的次序对每个结点进行顺序编号,编号为i的结点和满二叉树中编号为i的结点在二叉树中位置相同,则这个二叉树称为完全二叉树。
如何把满二叉树变成完全二叉树?
把一棵满二叉树,从最下层开始,自右向左(连续,不可跳跃)剪掉若干个结点,得到的就是一棵完全二叉树
性质1(深度计算):n个节点的完全二叉树,如果满足 2^{k-1}≤n<2^k,则深度为k
性质2(节点关系):
-
若i=1,则为根节点(无父节点)
-
若i>1,则父节点编号为 i/2
-
若2i > n,则无左孩子,更没有右孩子
-
若 i 结点有左孩子,则左孩子为2i
-
若 i 结点有右孩子,则其右孩子的编号为2i+1
三、典型例题解析
例题1
题目:一棵二叉树如图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i ,则其左孩子位于下标2i处、右孩子位于下标2i+l处),则该数组的最大下标至少为( )
A. 6 B. 10 C. 15 D. 12
解析:答案c,完全二叉树的根据性质1可得。
例题2
题目:根节点深度为 0,一棵深度为 h 的满 k(k>1)叉树,即除最后一层无任何子节点外,每一层上的所有结点都有 k 个子结点的树,共有( )个结点。
A. (k^{h+1}-1)/(k-1) B. k^h-1 C. k^h D. (k^h-1)/(k-1)
解析:
深度为h(根深度0),实际有h+1层。
节点数求和:S = k^0 + k^1 + ... + k^h = {k^{h+1}-1}{k-1}
答案为A
例题3
题目:根高度为1,61个节点的完全二叉树高度为( )(2015-17)
A. 5 B. 6 C. 7 D. 8
解析:
设高度为h,则满足:2^{h-1} - 1 < 61 < 2^h - 1
计算可得h=6
答案为B
例题4
题目:5层满二叉树的节点数为( )(2014-16)
A. 31 B. 32 C. 33 D. 16
解析:
2^5 - 1 = 31,答案为A
例题5
题目:2015个节点的二叉树最多有( )个叶子节点(2015-22)
解析:
设叶子节点数为n_0,度为2的节点数为n_2
由性质3:n_0 = n_2 + 1
总结点数:n_0 + n_1 + n_2 = 2015
代入得:(n_2+1) + n_1 + n_2 = 2015→ 2n_2 + n_1 = 2014
要使n_0最大,需n_2最大,则n_1最小(取0)
2n_2 = 2014 → n_2 = 1007→ n_0 = 1008
四、总结与思考
二叉树的性质揭示了树形结构的数学规律:
-
层节点数:指数级增长(性质1)
-
叶-枝关系:叶子数总比二度节点多1(性质3)
-
完全二叉树:高效存储的基础(数组表示)
-
满二叉树:理想平衡状态
实际应用:
-
二叉堆(优先队列):基于完全二叉树
-
哈夫曼编码:基于最优二叉树
-
数据库索引:B/B+树的基础
思考题:
在一棵完全二叉树中,编号为i和j的两个节点的最近公共祖先(LCA)编号如何计算?
(提示:利用完全二叉树的编号性质,不断除以2比较)
相关文章:

c++数据结构8——二叉树的性质
一、二叉树的基本性质 示图1: 性质1:层节点数上限 在一棵二叉树中,第i层至多有2^{i-1}个节点(首层是第1层) 这个性质可以通过数学归纳法证明: 第1层:2^{1-1}2^01个节点(根节点&am…...

Window Server 2019--08 网络负载均衡与Web Farm
本章要点 1、了解网络负载均衡技术 2、掌握Web Farm核心原理 3、掌握如何使用Windows NLB搭建Web Farm环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上,接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…...
arcgis字段计算器中计算矢量面的每个点坐标
python脚本 函数 def ExportCoordinates(feat):coors = []partnum = 0partcount = feat.partCountwhile partnum < partcount:part = feat.getPart(partnum)pnt = part.next()while pnt:coors.append("({}, {})".format(pnt.X,pnt.Y))pnt = part.next()if not p…...

SpringBoot:统一功能处理、拦截器、适配器模式
文章目录 拦截器什么是拦截器?为什么要使用拦截器?拦截器的使用拦截路径执行流程典型应用场景DispatcherServlet源码分析 适配器模式适配器模式定义适配器模式角色适配器模式的实现适配器模式应用场景 统⼀数据返回格式优点 统一处理异常总结 拦截器 什…...

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!
在人工智能技术持续深入行业应用的背景下,越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动,AI Agent的崛起已经成为了不可忽视的趋势。AI Agent,即人工智能代理,是一种基于先进的人工智能技术,特别…...
GitLab CI流水线权限隔离
方案概述 本方案实现在GitLab CI/CD中根据不同人员的权限级别执行不同的流水线步骤,主要基于GitLab的以下特性: rules 条件判断variables 变量传递only/except 条件限制用户权限API查询 基础权限模型设计 1. 用户角色定义 角色描述对应GitLab权限De…...
xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
很可能是因为我们上次没有正常关闭Xcode,而Xcode保留了上次错误的一些记录,而这次打开Xcode依然去加载错误的记录,所以必须完全删除这些记录Xcode才能加载正常的项目。 那么也就是说,我们是不是只需要删除这部分错误记录文件就可以…...

Onvif协议:IPC客户端开发-IPC相机控制(c语言版)
前言: 本博文主要是借鉴OceanStar大神的博文,在他的博文的基础之上做了一部分修改与简化。 博文链接: Onvif协议:IPC客户端开发之鉴权_onvif鉴权方式-CSDN博客 Onvif协议:IPC客户端开发之PTZ控制_onvif ptz-CSDN博客…...

如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?
PyTorch是一门科学——现代深度学习工程中的一把锋利利器。它的简洁、优雅、强大,正在让越来越多的AI研究者、开发者深度应用。 1. PyTorch到底是什么?为什么它重要? PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)于2016年发布,它的名字由两个部分组成…...

QT+opecv如何更改图片的拍摄路径
如何更改相机拍摄图片的路径 前言:基础夯实:效果展示:实现功能:遇到问题:未解决: 核心代码: 前言: 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题,用户可自己选…...
WebSocket学习总结
WebSocket 是一种基于TCP的网络通信协议,允许浏览器和服务器之间进行全双工、实时、低延迟的双向数据传输。它突破了传统HTTP协议的限制(请求-响应模式),特别适合需要实时通信的场景(如聊天、实时数据推送、游戏等&…...

秋招Day11 - JVM - 类加载机制
了解类的加载机制吗? JVM是运行Java字节码,也就是运行.class文件的虚拟机,JVM把.class文件中描述类的数据结构加载到内存中,并对数据进行校验,解析和初始化,最终转化为JVM可以使用的类型(Klass…...

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)
目录 一、源码分析 1.分析闭合 2.分析输出 (1)查询成功 (2)查询失败 (3)SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 (1)盲注分析 (2…...
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums PostgreSQL 提供了两种重要的数据完整性检查机制:amcheck 扩展和 pg_checksums 工具。它们在功能定位、检查层次和使用场景上有显著区别。 核心对比概览 特性amcheckpg_checksums检查对象…...

Vert.x学习笔记-什么是Handler
Vert.x学习笔记 在Vert.x中,Handler是一个核心概念,用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一,通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口,定义如下&#…...
浏览器游戏的次世代革命:WebAssembly 3.0 实战指南
破局开篇:开发者必须跨越的性能鸿沟 在2025年,WebAssembly(WASM)技术已经成为高性能Web应用的核心驱动力。特别是WASM3引擎的广泛应用,使得在浏览器中实现主机级游戏画质成为可能。本文将深入探讨WASM3的关键特性、性…...
Java设计模式之工厂模式与策略模式简单案例学习
目录 1.前言2.工厂模式2.1 简单工厂方法2.2 静态工厂方法2.3 抽象工厂方法 3.策略模式4.区别与联系4.1定义与核心意图4.2 UML 结构对比4.3 关键组成对比4.4 应用场景对比 1.前言 最近接手的项目真的是太无语了,经历了多数人的编写,什么牛马鬼神写法都有&…...

【Echarts】象形图
目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…...
git 本地合并怎么撤回
在Git中,如果你已经执行了合并(merge)操作,但发现合并的结果不符合预期,你可以通过以下几种方式来撤销这次合并: 1. 使用git merge --abort 如果你在合并过程中还没有完成合并的提交(即合并冲…...

集星云推短视频矩阵系统的定制化与私有化部署方案
在当今数字化营销时代,短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性,为企业提供了全方位的解决方案。 一、API接口定制:无缝对接自有系统 集星云推短视频矩…...
npm run build 报错:Some chunks are larger than 500 KB after minification
当我们的 Vue 项目太大,使用 npm run build 打包项目的时候,就有可能会遇到以下报错: (!) Some chunks are larger than 500 kB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollup…...

XCTF-web-file_include
解析 <?php highlight_file(__FILE__); // 高亮显示当前PHP文件源代码 include("./check.php"); // 包含检查文件(可能包含安全过滤逻辑)if(isset($_GET[filename])) { // 检查是否传入filename参数$filename $_GET[f…...

5.28 后端面经
为什么golang在并发环境下更有优势 Go语言(Golang)在并发环境下的优势主要源自其设计哲学和内置的并发机制,这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析: 1. Goroutine:轻量…...

CPP中CAS std::chrono 信号量与Any类的手动实现
前言 CAS(Compare and Swap) 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数:内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时,CAS才会将内存位…...

PHP生成pdf方法
1:第一种方法: 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1:NPM【版本:9.2.0】 1.2:NODE【版本:v18.19.1】 1.3:puppeteer【npm in…...

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)
写在前面的话,为了保持Sceneform-EQR始终是采用最新的filament,每隔一段时间我都会编译filament,并根据新增内容完善Sceneform-EQR。 现由于更换电脑,环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…...

C#中的BeginInvoke和EndInvoke:异步编程的双剑客
文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…...

告别延迟!modbus tcp转profine网关助力改造电厂改造升级
发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电,您都需要提高运营效率,并在资产老化、资源萎缩的情况下,紧跟不断变化的法规。如今,智能系统和技术能够帮助您实现运营转型,提高可视性并实现关键流程自动…...

《软件工程》第 5 章 - 需求分析模型的表示
目录 5.1需求分析与验证 5.1.1 顺序图 5.1.2 通信图 5.1.3 状态图 5.1.4 扩充机制 5.2 需求分析的过程模型 5.3 需求优先级分析 5.3.1 确定需求项优先级 5.3.2 排定用例分析的优先顺序 5.4 用例分析 5.4.1 精化领域概念模型 5.4.2 设置分析类 5.4.3 构思分析类之间…...
解释k8s种ConfigMap和Secret的作用,如何在Pod中挂载环境变
一、ConfigMap & Secret 核心定位 属于Kubernetes的配置管理特性,用于解耦应用与配置 1. ConfigMap 作用:存储非敏感配置数据 存储内容: 环境变量命令行参数配置文件(如JSON/XML/YAML)系统参数(如J…...