mirror of
https://github.com/krahets/hello-algo.git
synced 2025-11-02 12:58:42 +08:00
Number the H1 and H2 headings.
This commit is contained in:
@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# AVL 树 *
|
||||
# 7.4. AVL 树 *
|
||||
|
||||
在「二叉搜索树」章节中提到,在进行多次插入与删除操作后,二叉搜索树可能会退化为链表。此时所有操作的时间复杂度都会由 $O(\log n)$ 劣化至 $O(n)$ 。
|
||||
|
||||
@ -18,7 +18,7 @@ G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorit
|
||||
|
||||
换言之,在频繁增删查改的使用场景中,AVL 树可始终保持很高的数据增删查改效率,具有很好的应用价值。
|
||||
|
||||
## AVL 树常见术语
|
||||
## 7.4.1. AVL 树常见术语
|
||||
|
||||
「AVL 树」既是「二叉搜索树」又是「平衡二叉树」,同时满足这两种二叉树的所有性质,因此又被称为「平衡二叉搜索树」。
|
||||
|
||||
@ -329,7 +329,7 @@ G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorit
|
||||
|
||||
设平衡因子为 $f$ ,则一棵 AVL 树的任意结点的平衡因子皆满足 $-1 \le f \le 1$ 。
|
||||
|
||||
## AVL 树旋转
|
||||
## 7.4.2. AVL 树旋转
|
||||
|
||||
AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影响二叉树中序遍历序列的前提下,使失衡结点重新恢复平衡**。换言之,旋转操作既可以使树保持为「二叉搜索树」,也可以使树重新恢复为「平衡二叉树」。
|
||||
|
||||
@ -827,7 +827,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
}
|
||||
```
|
||||
|
||||
## AVL 树常用操作
|
||||
## 7.4.3. AVL 树常用操作
|
||||
|
||||
### 插入结点
|
||||
|
||||
@ -1253,7 +1253,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
|
||||
「AVL 树」的结点查找操作与「二叉搜索树」一致,在此不再赘述。
|
||||
|
||||
## AVL 树典型应用
|
||||
## 7.4.4. AVL 树典型应用
|
||||
|
||||
- 组织存储大型数据,适用于高频查找、低频增删场景;
|
||||
- 用于建立数据库中的索引系统;
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二叉搜索树
|
||||
# 7.3. 二叉搜索树
|
||||
|
||||
「二叉搜索树 Binary Search Tree」满足以下条件:
|
||||
|
||||
@ -11,7 +11,7 @@ comments: true
|
||||
|
||||

|
||||
|
||||
## 二叉搜索树的操作
|
||||
## 7.3.1. 二叉搜索树的操作
|
||||
|
||||
### 查找结点
|
||||
|
||||
@ -934,7 +934,7 @@ comments: true
|
||||
}
|
||||
```
|
||||
|
||||
## 二叉搜索树的效率
|
||||
## 7.3.2. 二叉搜索树的效率
|
||||
|
||||
假设给定 $n$ 个数字,最常用的存储方式是「数组」,那么对于这串乱序的数字,常见操作的效率为:
|
||||
|
||||
@ -963,7 +963,7 @@ comments: true
|
||||
|
||||
</div>
|
||||
|
||||
## 二叉搜索树的退化
|
||||
## 7.3.3. 二叉搜索树的退化
|
||||
|
||||
理想情况下,我们希望二叉搜索树的是“左右平衡”的(详见「平衡二叉树」章节),此时可以在 $\log n$ 轮循环内查找任意结点。
|
||||
|
||||
@ -975,7 +975,7 @@ comments: true
|
||||
|
||||

|
||||
|
||||
## 二叉搜索树常见应用
|
||||
## 7.3.4. 二叉搜索树常见应用
|
||||
|
||||
- 系统中的多级索引,高效查找、插入、删除操作。
|
||||
- 各种搜索算法的底层数据结构。
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二叉树
|
||||
# 7.1. 二叉树
|
||||
|
||||
「二叉树 Binary Tree」是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。类似于链表,二叉树也是以结点为单位存储的,结点包含「值」和两个「指针」。
|
||||
|
||||
@ -129,7 +129,7 @@ comments: true
|
||||
|
||||
<p align="center"> Fig. 子结点与子树 </p>
|
||||
|
||||
## 二叉树常见术语
|
||||
## 7.1.1. 二叉树常见术语
|
||||
|
||||
二叉树的术语较多,建议尽量理解并记住。后续可能遗忘,可以在需要使用时回来查看确认。
|
||||
|
||||
@ -150,7 +150,7 @@ comments: true
|
||||
|
||||
值得注意,我们通常将「高度」和「深度」定义为“走过边的数量”,而有些题目或教材会将其定义为“走过结点的数量”,此时高度或深度都需要 + 1 。
|
||||
|
||||
## 二叉树基本操作
|
||||
## 7.1.2. 二叉树基本操作
|
||||
|
||||
**初始化二叉树**。与链表类似,先初始化结点,再构建引用指向(即指针)。
|
||||
|
||||
@ -404,7 +404,7 @@ comments: true
|
||||
|
||||
插入结点会改变二叉树的原有逻辑结构,删除结点往往意味着删除了该结点的所有子树。因此,二叉树中的插入与删除一般都是由一套操作配合完成的,这样才能实现有意义的操作。
|
||||
|
||||
## 常见二叉树类型
|
||||
## 7.1.3. 常见二叉树类型
|
||||
|
||||
### 完美二叉树
|
||||
|
||||
@ -436,7 +436,7 @@ comments: true
|
||||
|
||||

|
||||
|
||||
## 二叉树的退化
|
||||
## 7.1.4. 二叉树的退化
|
||||
|
||||
当二叉树的每层的结点都被填满时,达到「完美二叉树」;而当所有结点都偏向一边时,二叉树退化为「链表」。
|
||||
|
||||
@ -460,7 +460,7 @@ comments: true
|
||||
|
||||
</div>
|
||||
|
||||
## 二叉树表示方式 *
|
||||
## 7.1.5. 二叉树表示方式 *
|
||||
|
||||
我们一般使用二叉树的「链表表示」,即存储单位为结点 `TreeNode` ,结点之间通过指针(引用)相连接。本文前述示例代码展示了二叉树在链表表示下的各项基本操作。
|
||||
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 二叉树遍历
|
||||
# 7.2. 二叉树遍历
|
||||
|
||||
非线性数据结构的遍历操作比线性数据结构更加复杂,往往需要使用搜索算法来实现。常见的二叉树遍历方式有层序遍历、前序遍历、中序遍历、后序遍历。
|
||||
|
||||
## 层序遍历
|
||||
## 7.2.1. 层序遍历
|
||||
|
||||
「层序遍历 Hierarchical-Order Traversal」从顶至底、一层一层地遍历二叉树,并在每层中按照从左到右的顺序访问结点。
|
||||
|
||||
@ -208,7 +208,7 @@ comments: true
|
||||
}
|
||||
```
|
||||
|
||||
## 前序、中序、后序遍历
|
||||
## 7.2.2. 前序、中序、后序遍历
|
||||
|
||||
相对地,前、中、后序遍历皆属于「深度优先遍历 Depth-First Traversal」,其体现着一种“先走到尽头,再回头继续”的回溯遍历方式。
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
# 7.5. 小结
|
||||
|
||||
- 二叉树是一种非线性数据结构,代表着“一分为二”的分治逻辑。二叉树的结点包含「值」和两个「指针」,分别指向左子结点和右子结点。
|
||||
- 选定二叉树中某结点,将其左(右)子结点以下形成的树称为左(右)子树。
|
||||
|
||||
Reference in New Issue
Block a user