This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions
+4 -4
View File
@@ -2,13 +2,13 @@
comments: true
---
# 7.3.   二叉树数组表示
# 7.3   二叉树数组表示
在链表表示下,二叉树的存储单元为节点 `TreeNode` ,节点之间通过指针相连接。在上节中,我们学习了在链表表示下的二叉树的各项基本操作。
那么,能否用「数组」来表示二叉树呢?答案是肯定的。
## 7.3.1.   表示完美二叉树
## 7.3.1   表示完美二叉树
先分析一个简单案例。给定一个完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每个节点都对应唯一的数组索引。
@@ -20,7 +20,7 @@ comments: true
**映射公式的角色相当于链表中的指针**。给定数组中的任意一个节点,我们都可以通过映射公式来访问它的左(右)子节点。
## 7.3.2.   表示任意二叉树
## 7.3.2   表示任意二叉树
然而完美二叉树是一个特例,在二叉树的中间层,通常存在许多 $\text{None}$ 。由于层序遍历序列并不包含这些 $\text{None}$ ,因此我们无法仅凭该序列来推测 $\text{None}$ 的数量和分布位置。**这意味着存在多种二叉树结构都符合该层序遍历序列**。显然在这种情况下,上述的数组表示方法已经失效。
@@ -1153,7 +1153,7 @@ comments: true
}
```
## 7.3.3.   优势与局限性
## 7.3.3   优势与局限性
二叉树的数组表示的优点包括:
+5 -5
View File
@@ -2,7 +2,7 @@
comments: true
---
# 7.5.   AVL 树 *
# 7.5   AVL 树 *
在二叉搜索树章节中,我们提到了在多次插入和删除操作后,二叉搜索树可能退化为链表。这种情况下,所有操作的时间复杂度将从 $O(\log n)$ 恶化为 $O(n)$。
@@ -20,7 +20,7 @@ comments: true
G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorithm for the organization of information" 中提出了「AVL 树」。论文中详细描述了一系列操作,确保在持续添加和删除节点后,AVL 树不会退化,从而使得各种操作的时间复杂度保持在 $O(\log n)$ 级别。换句话说,在需要频繁进行增删查改操作的场景中,AVL 树能始终保持高效的数据操作性能,具有很好的应用价值。
## 7.5.1.   AVL 树常见术语
## 7.5.1   AVL 树常见术语
「AVL 树」既是二叉搜索树也是平衡二叉树,同时满足这两类二叉树的所有性质,因此也被称为「平衡二叉搜索树」。
@@ -580,7 +580,7 @@ G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorit
设平衡因子为 $f$ ,则一棵 AVL 树的任意节点的平衡因子皆满足 $-1 \le f \le 1$ 。
## 7.5.2.   AVL 树旋转
## 7.5.2   AVL 树旋转
AVL 树的特点在于「旋转 Rotation」操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平衡。换句话说,**旋转操作既能保持树的「二叉搜索树」属性,也能使树重新变为「平衡二叉树」**。
@@ -1519,7 +1519,7 @@ AVL 树的特点在于「旋转 Rotation」操作,它能够在不影响二叉
}
```
## 7.5.3.   AVL 树常用操作
## 7.5.3   AVL 树常用操作
### 插入节点
@@ -2436,7 +2436,7 @@ AVL 树的特点在于「旋转 Rotation」操作,它能够在不影响二叉
AVL 树的节点查找操作与二叉搜索树一致,在此不再赘述。
## 7.5.4.   AVL 树典型应用
## 7.5.4   AVL 树典型应用
- 组织和存储大型数据,适用于高频查找、低频增删的场景。
- 用于构建数据库中的索引系统。
+4 -4
View File
@@ -2,7 +2,7 @@
comments: true
---
# 7.4.   二叉搜索树
# 7.4   二叉搜索树
「二叉搜索树 Binary Search Tree」满足以下条件:
@@ -13,7 +13,7 @@ comments: true
<p align="center"> 图:二叉搜索树 </p>
## 7.4.1. &nbsp; 二叉搜索树的操作
## 7.4.1 &nbsp; 二叉搜索树的操作
我们将二叉搜索树封装为一个类 `ArrayBinaryTree` ,并声明一个成员变量 `root` ,指向树的根节点。
@@ -1484,7 +1484,7 @@ comments: true
<p align="center"> 图:二叉搜索树的中序遍历序列 </p>
## 7.4.2. &nbsp; 二叉搜索树的效率
## 7.4.2 &nbsp; 二叉搜索树的效率
给定一组数据,我们考虑使用数组或二叉搜索树存储。
@@ -1509,7 +1509,7 @@ comments: true
<p align="center"> 图:二叉搜索树的平衡与退化 </p>
## 7.4.3. &nbsp; 二叉搜索树常见应用
## 7.4.3 &nbsp; 二叉搜索树常见应用
- 用作系统中的多级索引,实现高效的查找、插入、删除操作。
- 作为某些搜索算法的底层数据结构。
+5 -5
View File
@@ -2,7 +2,7 @@
comments: true
---
# 7.1. &nbsp; 二叉树
# 7.1 &nbsp; 二叉树
「二叉树 Binary Tree」是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含:值、左子节点引用、右子节点引用。
@@ -173,7 +173,7 @@ comments: true
<p align="center"> 图:父节点、子节点、子树 </p>
## 7.1.1. &nbsp; 二叉树常见术语
## 7.1.1 &nbsp; 二叉树常见术语
二叉树涉及的术语较多,建议尽量理解并记住。
@@ -194,7 +194,7 @@ comments: true
请注意,我们通常将「高度」和「深度」定义为“走过边的数量”,但有些题目或教材可能会将其定义为“走过节点的数量”。在这种情况下,高度和深度都需要加 1 。
## 7.1.2. &nbsp; 二叉树基本操作
## 7.1.2 &nbsp; 二叉树基本操作
**初始化二叉树**。与链表类似,首先初始化节点,然后构建引用指向(即指针)。
@@ -518,7 +518,7 @@ comments: true
需要注意的是,插入节点可能会改变二叉树的原有逻辑结构,而删除节点通常意味着删除该节点及其所有子树。因此,在二叉树中,插入与删除操作通常是由一套操作配合完成的,以实现有实际意义的操作。
## 7.1.3. &nbsp; 常见二叉树类型
## 7.1.3 &nbsp; 常见二叉树类型
### 完美二叉树
@@ -556,7 +556,7 @@ comments: true
<p align="center"> 图:平衡二叉树 </p>
## 7.1.4. &nbsp; 二叉树的退化
## 7.1.4 &nbsp; 二叉树的退化
当二叉树的每层节点都被填满时,达到「完美二叉树」;而当所有节点都偏向一侧时,二叉树退化为「链表」。
+3 -3
View File
@@ -2,13 +2,13 @@
comments: true
---
# 7.2. &nbsp; 二叉树遍历
# 7.2 &nbsp; 二叉树遍历
从物理结构的角度来看,树是一种基于链表的数据结构,因此其遍历方式是通过指针逐个访问节点。然而,树是一种非线性数据结构,这使得遍历树比遍历链表更加复杂,需要借助搜索算法来实现。
二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。
## 7.2.1. &nbsp; 层序遍历
## 7.2.1 &nbsp; 层序遍历
「层序遍历 Level-Order Traversal」从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。
@@ -326,7 +326,7 @@ comments: true
**空间复杂度**:在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 $\frac{n + 1}{2}$ 个节点,占用 $O(n)$ 空间。
## 7.2.2. &nbsp; 前序、中序、后序遍历
## 7.2.2 &nbsp; 前序、中序、后序遍历
相应地,前序、中序和后序遍历都属于「深度优先遍历 Depth-First Traversal」,它体现了一种“先走到尽头,再回溯继续”的遍历方式。
+1 -1
View File
@@ -3,7 +3,7 @@ comments: true
icon: material/graph-outline
---
# 7. &nbsp; 树
# 第 7 章 &nbsp; 树
<div class="center-table" markdown>
+2 -2
View File
@@ -2,7 +2,7 @@
comments: true
---
# 7.6. &nbsp; 小结
# 7.6 &nbsp; 小结
- 二叉树是一种非线性数据结构,体现“一分为二”的分治逻辑。每个二叉树节点包含一个值以及两个指针,分别指向其左子节点和右子节点。
- 对于二叉树中的某个节点,其左(右)子节点及其以下形成的树被称为该节点的左(右)子树。
@@ -16,7 +16,7 @@ comments: true
- AVL 树,也称为平衡二叉搜索树,它通过旋转操作,确保在不断插入和删除节点后,树仍然保持平衡。
- AVL 树的旋转操作包括右旋、左旋、先右旋再左旋、先左旋再右旋。在插入或删除节点后,AVL 树会从底向顶执行旋转操作,使树重新恢复平衡。
## 7.6.1. &nbsp; Q & A
## 7.6.1 &nbsp; Q & A
!!! question "对于只有一个节点的二叉树,树的高度和根节点的深度都是 $0$ 吗?"