【数据结构】树的基本:结点、度、高度与计算
树是数据结构中一种重要的非线性结构,广泛应用于计算机科学的各个领域,例如文件系统、数据库索引、编译器等。理解树的各种性质,如结点数、度、高度等,对于解决实际问题至关重要。
本文将会探讨树的基本概念,以及给出几个王道考研例题和常见公式,不对树的数据结构做出过多原理解释
1. 树的基本概念
- 结点 (Node): 树中的每个元素称为结点。结点包含数据和指向子结点的指针。
- 边 (Edge): 连接两个结点的线称为边。
- 根结点 (Root): 树的顶端结点,没有父结点。
- 父结点 (Parent): 若一个结点包含指向另一个结点的指针,则称前者为后者的父结点。
- 子结点 (Child): 若一个结点被另一个结点指向,则称前者为后者的子结点。
- 兄弟结点 (Sibling): 拥有同一个父结点的结点互称为兄弟结点。
- 叶结点 (Leaf): 没有子结点的结点称为叶结点。
- 度 (Degree): 一个结点的子结点个数称为该结点的度。
- 树的度 (Degree of a Tree): 树中所有结点的度的最大值称为树的度。
- 路径 (Path): 从一个结点到另一个结点所经过的结点序列称为路径。
- 路径长度 (Path Length): 路径上边的数量。
- 层 (Level): 根结点为第 1 层,其子结点为第 2 层,以此类推。
- 高度 (Height): 从根结点到最远叶子结点的最长路径上的结点数(或边的数量加 1)。
- 深度 (Depth): 从根结点到该结点的路径长度加 1。
2. 树的重要性质和公式
-
结点数与度数的关系: 设 n n n 为树的结点总数, n i n_i ni 表示度为 i i i 的结点个数,则有:
n = ∑ i = 0 m n i n = \sum_{i=0}^{m} n_i n=i=0∑mni
其中 m m m 是树的度。同时,根据每个结点(除根结点外)都恰好有一个父结点,可以得到:
n = ∑ i = 0 m i ⋅ n i + 1 n = \sum_{i=0}^{m} i \cdot n_i + 1 n=i=0∑mi⋅ni+1
这个公式非常重要,在很多题目中都会用到。
-
第 i i i 层最多结点数: 度为 m m m 的树中,第 i i i 层上至多有 m i − 1 m^{i-1} mi−1 个结点 ( i ≥ 1 i \ge 1 i≥1)。这个性质可以通过数学归纳法证明。
-
高度为 h h h 的 m m m 叉树最多结点数: 高度为 h h h 的 m m m 叉树至多有 m h − 1 m − 1 \frac{m^h - 1}{m - 1} m−1mh−1 个结点。当每一层的结点数都达到最大值时,总结点数达到最大。这个公式可以通过等比数列求和公式推导得出:
1 + m + m 2 + ⋯ + m h − 1 = m h − 1 m − 1 1 + m + m^2 + \cdots + m^{h-1} = \frac{m^h - 1}{m - 1} 1+m+m2+⋯+mh−1=m−1mh−1
-
n n n 个结点的 m m m 叉树最小高度: 度为 m m m、具有 n n n 个结点的树的最小高度 h h h 为 ⌈ log m ( n ( m − 1 ) + 1 ) ⌉ \lceil \log_m(n(m-1) + 1) \rceil ⌈logm(n(m−1)+1)⌉,其中 ⌈ x ⌉ \lceil x \rceil ⌈x⌉ 表示向上取整。为了使高度最小,应尽可能使每一层的结点数都达到最大值,即形成完全 m m m 叉树。
推导过程如下:假设前 h − 1 h-1 h−1 层都是满的,则前 h − 1 h-1 h−1 层的结点数为 m h − 1 − 1 m − 1 \frac{m^{h-1} - 1}{m - 1} m−1mh−1−1。加上第 h h h 层的结点,总结点数 n n n 满足:
m h − 1 − 1 m − 1 < n ≤ m h − 1 m − 1 \frac{m^{h-1} - 1}{m - 1} < n \le \frac{m^h - 1}{m - 1} m−1mh−1−1<n≤m−1mh−1
化简不等式,可得最小高度 h h h。
-
n n n 个结点的 m m m 叉树最大高度: 度为 m m m、具有 n n n 个结点的树的最大高度 h h h 为 n − m + 1 n - m + 1 n−m+1。为了使高度最大,应尽可能使除少数结点外,其他结点都只有一个子结点,形成“链状”结构。
3. 例题实战
例题 04: 对于一棵具有 n n n 个结点、度为 4 的树来说,()。
A. 树的高度至多是 n − 3 n-3 n−3
B. 树的高度至多是 n − 4 n-4 n−4
C. 第 i i i 层上至多有 4 ( i − 1 ) 4(i-1) 4(i−1) 个结点
D. 至少在某一层上正好有 4 个结点
解析: 根据性质 5,度为 4 的树,其最大高度为 n − 4 + 1 = n − 3 n - 4 + 1 = n - 3 n−4+1=n−3,故 A 正确。C 选项根据性质 2,第 i i i 层最多有 4 i − 1 4^{i-1} 4i−1 个结点,而不是 4 ( i − 1 ) 4(i-1) 4(i−1) 个。D 不一定成立,例如只有根结点和四个子结点的树,只有一层有 4 个结点。
答案: A
例题 05: 度为 4、高度为 h h h 的树,()。
A. 至少有 h + 3 h+3 h+3 个结点
B. 至多有 4 h − 1 4h-1 4h−1 个结点
C. 至少有 4 h 4h 4h 个结点
D. 至多有 h + 4 h + 4 h+4 个结点
解析: 根据性质 5 的逆推,高度为 h h h、度为 m m m 的树至少有 h + m − 1 h + m - 1 h+m−1 个结点,所以度为 4、高度为 h h h 的树至少有 h + 4 − 1 = h + 3 h + 4 - 1 = h + 3 h+4−1=h+3 个结点,故 A 正确。
答案: A
例题 06: 假定一棵度为 3 的树中,结点数为 50,则其最小高度为 ()。
A. 3
B. 4
C. 5
D. 6
解析: 根据性质 4,最小高度 h = ⌈ log 3 ( 50 ( 3 − 1 ) + 1 ) ⌉ = ⌈ log 3 ( 101 ) ⌉ h = \lceil \log_3(50(3-1) + 1) \rceil = \lceil \log_3(101) \rceil h=⌈log3(50(3−1)+1)⌉=⌈log3(101)⌉。因为 3 4 = 81 3^4 = 81 34=81, 3 5 = 243 3^5 = 243 35=243,所以 log 3 ( 101 ) \log_3(101) log3(101) 介于 4 和 5 之间,向上取整为 5。
答案: C
例题 07: 若森林 F F F 有 15 条边、25 个结点,则 F F F 包含树的个数是( )。
A. 8
B. 9
C. 10
D. 11
解答:
森林的性质:对于一片森林,树的个数 t = n − e t=n−e t=n−e,其中 n n n 是结点数, e e e 是边数。
代入数据:
t = 25 − 15 = 10 t=25−15=10 t=25−15=10
因此,森林 FF 包含 10 棵树。
答案: C
例题8: 设呀一颗 m m m 叉树中有 N 1 N_1 N1 个度数为 1 1 1 的节点, N 2 N_2 N2 个度数为 2 2 2 的节点 . . . ... ... N m N_m Nm 个度数为 m m m 的节点,则该树中共有( )个叶子节点
A. ∑ i = 1 m ( i − 1 ) N i \sum_{i=1}^m(i-1) N_i ∑i=1m(i−1)Ni
B. ∑ i = 1 m N i \sum_{i=1}^m N_i ∑i=1mNi
C. ∑ i = 2 m ( i − 1 ) N i \sum_{i=2}^m(i-1) N_i ∑i=2m(i−1)Ni
D. ∑ i = 2 m ( i − 1 ) N i + 1 \sum_{i=2}^m(i-1) N_i+1 ∑i=2m(i−1)Ni+1
**答案:**D
解答:
在一颗 m m m 叉树中,除了叶节点之外,每个节点都有一个父节点,因此我们可以利用下面两个等式:
- 总节点数 = 叶子节点 + 非叶子节点
- 总节点数 = 总度数 + 1 -> 总度数 = 总节点数 - 1
所以,我们假设总节点数为 N N N,叶子节点数为 N 0 N_0 N0,则
- 总结点数 N = N 0 + N 1 + N 2 + . . . + N m N = N_0 + N_1 + N_2 + ... + Nm N=N0+N1+N2+...+Nm
- 总度数 = 1 ∗ N 1 + 2 ∗ N 2 + . . . + m ∗ N M 1 * N_1 + 2 * N_2 + ... + m * N_M 1∗N1+2∗N2+...+m∗NM
联立等式
N 0 + N 1 + N 2 + . . . + N m − 1 = 1 ∗ N 1 + 2 ∗ N 2 + 3 ∗ N 3 + . . . + m ∗ N M N_0 + N_1 + N_2 + ... + Nm - 1 = 1 * N_1 + 2 * N_2 + 3 * N_3 + ... + m * N_M N0+N1+N2+...+Nm−1=1∗N1+2∗N2+3∗N3+...+m∗NM
可解的
N 0 = 1 ∗ N 2 + . . . + ( m − 1 ) ∗ N m + 1 N_0 = 1 * N_2 + ... + (m - 1) * N_m + 1 N0=1∗N2+...+(m−1)∗Nm+1
N 0 = ∑ m = 2 m ( m − 1 ) N m + 1 N_0 = \sum_{m=2}^m(m - 1)N_m + 1 N0=∑m=2m(m−1)Nm+1
例题9:【2010 统考真题】在一棵度为 4 的树 T T T 中,若有 20 个度为 4 的结点, 10 个度为 3 的结点, 1 个度为 2 的结点, 10 个度为 1 的结点,则树 T T T 的叶结点个数是( )。
A. 41
B. 82
C. 113
D. 122
答案: B
解答:
这个问题是问题 08 的一个具体应用。已知了每个度数的结点数量,我们可以直接套用问题 08 中推导出的公式。
根据问题 08 的公式:
N 0 = ∑ i = 2 m ( i − 1 ) N i + 1 N_0=\sum_{i=2}^m(i-1) N_i+1 N0=i=2∑m(i−1)Ni+1
在问题 09 中, m = 4 , N 1 = 10 , N 2 = 1 , N 3 = 10 , N 4 = 20 m=4, ~ N_1=10, N_2=1, N_3=10, N_4=20 m=4, N1=10,N2=1,N3=10,N4=20 。将这些直代入公式:
N 0 = ( 2 − 1 ) ∗ N 2 + ( 3 − 1 ) ∗ N 3 + ( 4 − 1 ) ∗ N 4 + 1 N 0 = ( 1 ) ∗ 1 + ( 2 ) ∗ 10 + ( 3 ) ∗ 20 + 1 N 0 = 1 + 20 + 60 + 1 N 0 = 82 \begin{aligned} & N_0=(2-1) * N_2+(3-1) * N_3+(4-1) * N_4+1 \\ & N_0=(1) * 1+(2) * 10+(3) * 20+1 \\ & N_0=1+20+60+1 \\ & N_0=82 \end{aligned} N0=(2−1)∗N2+(3−1)∗N3+(4−1)∗N4+1N0=(1)∗1+(2)∗10+(3)∗20+1N0=1+20+60+1N0=82
6. 关键点总结
- 结点数与度数的关系: n = ∑ i = 0 m i ⋅ n i + 1 n = \sum_{i=0}^{m} i \cdot n_i + 1 n=∑i=0mi⋅ni+1
- 第 i i i 层最多结点数: m i − 1 m^{i-1} mi−1
- 高度为 h h h 的 m m m 叉树最多结点数: m h − 1 m − 1 \frac{m^h - 1}{m - 1} m−1mh−1
- n n n 个结点的 m m m 叉树最小高度: ⌈ log m ( n ( m − 1 ) + 1 ) ⌉ \lceil \log_m(n(m-1) + 1) \rceil ⌈logm(n(m−1)+1)⌉
- n n n 个结点的 m m m 叉树最大高度: n − m + 1 n - m + 1 n−m+1
- 对于一片森林,树的个数 t = n − e t=n−e t=n−e,其中 n n n 是结点数, e e e 是边数
相关文章:
【数据结构】树的基本:结点、度、高度与计算
树是数据结构中一种重要的非线性结构,广泛应用于计算机科学的各个领域,例如文件系统、数据库索引、编译器等。理解树的各种性质,如结点数、度、高度等,对于解决实际问题至关重要。 本文将会探讨树的基本概念,以及给出几…...

【Pytest】生成html报告中,中文乱码问题解决方案
链接上一篇文章:https://blog.csdn.net/u013080870/article/details/145369926?spm1001.2014.3001.5502 中文乱码问题,python3,Python3.7后,还一个文件就是result.py 因为中文可以在内容中,也可能在文件名,类名&…...

week08_文本匹配任务
1、文本匹配任务概述 狭义: 给定一组文本,判断其是否语义相似 今天天气不错 match 今儿个天不错呀 √ 今天天气不错 match 你的代码有bug 以分值形式给出相似度 今天天气不错 match 今儿个天不错呀 0.9 今天天气不错 match…...

JUC--ConcurrentHashMap底层原理
ConcurrentHashMap底层原理 ConcurrentHashMapJDK1.7底层结构线程安全底层具体实现 JDK1.8底层结构线程安全底层具体实现 总结JDK 1.7 和 JDK 1.8实现有什么不同?ConcurrentHashMap 中的 CAS 应用 ConcurrentHashMap ConcurrentHashMap 是一种线程安全的高效Map集合…...

【2024年华为OD机试】(C卷,200分)- 推荐多样性 (JavaScriptJava PythonC/C++)
一、问题描述 问题描述 我们需要从多个已排序的列表中选取元素,以填充多个窗口。每个窗口需要展示一定数量的元素,且元素的选择需要遵循特定的穿插策略。具体来说,我们需要: 从第一个列表中为每个窗口选择一个元素,然后从第二个列表中为每个窗口选择一个元素,依此类推。…...

【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)
祈愿在2025蛇年里, 伟大的祖国风调雨顺、国泰民安、每个人齐心协力,共同经历这百年未有之大变局时代(国际政治、AI技术……) 祝福亲友同事孩子们平安健康(安全、安全、安全)、巳巳如意! 背景需…...

[权限提升] 操作系统权限介绍
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,我们通过 Web 漏洞拿到的 Web 进程的…...
DeepSeek异军突起,重塑AI格局
DeepSeek异军突起,重塑AI格局这两天AI 圈发生了比过年更令人兴奋的事情,“Meta内部反水事件”、“黄仁勋的底盘问题”,以及AI格局的大动荡,一切都是因为那个叫DeepSeek的“中国自主AI”!它由幻方量化开发,以…...

git的理解与使用
本地的git git除了最经典的add commit push用来做版本管理,其实他的分支管理也非常强大 可以说你学好了分支管理,就可以完成团队的配合协作了 git仓库 我们可以使用git init来初始化一个git仓库,只要能看见.git文件夹,就代表这…...

Baklib打造内容中台新模式助力企业智能化升级
内容概要 在如今数字化日渐渗透各个行业的背景下,内容中台逐渐成为推动企业智能化转型的重要工具。内容中台不仅仅是一个信息管理平台,更是一个整合多种内容资源,提升企业反应能力与市场适应力的创新模式。随着数据量的激增,传统…...

STM32完全学习——RT-thread在STM32F407上移植
一、写在前面 关于源码的下载,以及在KEIL工程里面添加操作系统的源代码,这里就不再赘述了。需要注意的是RT-thread默认里面是会使用串口的,因此需要额外的进行串口的初始化,有些人可能会问,为什么不直接使用CubMAX直接…...

基于51单片机和ESP8266(01S)、LCD1602、DS1302、独立按键的WiFi时钟
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、延时2、定时器03、串口通信4、DS13025、LCD16026、独立按键 四、主函数总结 系列文章目录 前言 之前做了一个WiFi定时器时钟,用八位数码管进行显示,但是定时器时钟的精度较低࿰…...
启元世界(Inspir.ai)技术浅析(二):深度强化学习
深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...
LeetCode100之子集(78)--Java
1.问题描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例1 输入:nums [1,2,3]输出:[[],[1],[2],[1,2],[3],[1…...
React第二十五章(受控组件/非受控组件)
React 受控组件理解和应用 React 受控组件 受控组件一般是指表单元素,表单的数据由React的 State 管理,更新数据时,需要手动调用setState()方法,更新数据。因为React没有类似于Vue的v-model,所以需要自己实现绑定事件…...

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent
作者:来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴,我们很…...

嵌入式知识点总结 Linux驱动 (三)-文件系统
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.什么是文件系统? 2.根文件系统为什么这么重要?编辑 3.可执行映像文件通常由几部分构成,他们有什么特点? 1.什么是文件系统&a…...

【知识】可视化理解git中的cherry-pick、merge、rebase
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 这三个确实非常像,以至于对于初学者来说比较难理解。 总结对比 先给出对比: 特性git mergegit rebasegit cherry-pick功能合并…...

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像
一、背景 由于国际镜像国内无法直接访问,会导致搜索模型时加载失败,如下: 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意:务…...
新站如何快速获得搜索引擎收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/8.html 新站想要快速获得搜索引擎收录,需要采取一系列有针对性的策略。以下是一些具体的建议: 一、网站内容优化 高质量原创内容: 确保网站内容原创、…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...