【数据结构】树的基本:结点、度、高度与计算

树是数据结构中一种重要的非线性结构,广泛应用于计算机科学的各个领域,例如文件系统、数据库索引、编译器等。理解树的各种性质,如结点数、度、高度等,对于解决实际问题至关重要。

本文将会探讨树的基本概念,以及给出几个王道考研例题和常见公式,不对树的数据结构做出过多原理解释

1. 树的基本概念

  • 结点 (Node): 树中的每个元素称为结点。结点包含数据和指向子结点的指针。
  • 边 (Edge): 连接两个结点的线称为边。
  • 根结点 (Root): 树的顶端结点,没有父结点。
  • 父结点 (Parent): 若一个结点包含指向另一个结点的指针,则称前者为后者的父结点。
  • 子结点 (Child): 若一个结点被另一个结点指向,则称前者为后者的子结点。
  • 兄弟结点 (Sibling): 拥有同一个父结点的结点互称为兄弟结点。
  • 叶结点 (Leaf): 没有子结点的结点称为叶结点。
  • 度 (Degree): 一个结点的子结点个数称为该结点的度。
  • 树的度 (Degree of a Tree): 树中所有结点的度的最大值称为树的度。
  • 路径 (Path): 从一个结点到另一个结点所经过的结点序列称为路径。
  • 路径长度 (Path Length): 路径上边的数量。
  • 层 (Level): 根结点为第 1 层,其子结点为第 2 层,以此类推。
  • 高度 (Height): 从根结点到最远叶子结点的最长路径上的结点数(或边的数量加 1)。
  • 深度 (Depth): 从根结点到该结点的路径长度加 1。

2. 树的重要性质和公式

  1. 结点数与度数的关系: 设 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

    这个公式非常重要,在很多题目中都会用到。

  2. 第 i i i 层最多结点数: 度为 m m m 的树中,第 i i i 层上至多有 m i − 1 m^{i-1} mi−1 个结点 ( i ≥ 1 i \ge 1 i≥1)。这个性质可以通过数学归纳法证明。

  3. 高度为 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

  4. 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。

  5. 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. 总节点数 = 叶子节点 + 非叶子节点
  2. 总节点数 = 总度数 + 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 是边数
相关推荐
萧萧玉树27 分钟前
B树系列详解
数据结构·b树
苦 涩8 小时前
考研408笔记之数据结构(七)——排序
数据结构
Victoria.a10 小时前
顺序表和链表(详解)
数据结构·链表
笔耕不辍cj11 小时前
两两交换链表中的节点
数据结构·windows·链表
csj5011 小时前
数据结构基础之《(16)—链表题目》
数据结构
謓泽12 小时前
【数据结构】二分查找
数据结构·算法
攻城狮7号12 小时前
【10.2】队列-设计循环队列
数据结构·c++·算法
写代码超菜的13 小时前
数据结构(四) B树/跳表
数据结构
小小志爱学习14 小时前
提升 Go 开发效率的利器:calc_util 工具库
数据结构·算法·golang