Number the H1 and H2 headings.

This commit is contained in:
Yudong Jin
2023-01-31 03:37:50 +08:00
parent dbbc1adc4f
commit eb0afc98ec
44 changed files with 263 additions and 257 deletions

View File

@ -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 树典型应用
- 组织存储大型数据,适用于高频查找、低频增删场景;
- 用于建立数据库中的索引系统;

View File

@ -2,7 +2,7 @@
comments: true
---
# 二叉搜索树
# 7.3. 二叉搜索树
「二叉搜索树 Binary Search Tree」满足以下条件
@ -11,7 +11,7 @@ comments: true
![binary_search_tree](binary_search_tree.assets/binary_search_tree.png)
## 二叉搜索树的操作
## 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
![bst_degradation](binary_search_tree.assets/bst_degradation.png)
## 二叉搜索树常见应用
## 7.3.4. 二叉搜索树常见应用
- 系统中的多级索引,高效查找、插入、删除操作。
- 各种搜索算法的底层数据结构。

View File

@ -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
![balanced_binary_tree](binary_tree.assets/balanced_binary_tree.png)
## 二叉树的退化
## 7.1.4. 二叉树的退化
当二叉树的每层的结点都被填满时,达到「完美二叉树」;而当所有结点都偏向一边时,二叉树退化为「链表」。
@ -460,7 +460,7 @@ comments: true
</div>
## 二叉树表示方式 *
## 7.1.5. 二叉树表示方式 *
我们一般使用二叉树的「链表表示」,即存储单位为结点 `TreeNode` ,结点之间通过指针(引用)相连接。本文前述示例代码展示了二叉树在链表表示下的各项基本操作。

View File

@ -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」其体现着一种“先走到尽头再回头继续”的回溯遍历方式。

View File

@ -2,7 +2,7 @@
comments: true
---
# 小结
# 7.5. 小结
- 二叉树是一种非线性数据结构,代表着“一分为二”的分治逻辑。二叉树的结点包含「值」和两个「指针」,分别指向左子结点和右子结点。
- 选定二叉树中某结点,将其左(右)子结点以下形成的树称为左(右)子树。