refactor: Replace 结点 with 节点 (#452)

* Replace 结点 with 节点
Update the footnotes in the figures

* Update mindmap

* Reduce the size of the mindmap.png
This commit is contained in:
Yudong Jin
2023-04-09 04:32:17 +08:00
committed by GitHub
parent 3f4e32b2b0
commit 1c8b7ef559
395 changed files with 2056 additions and 2056 deletions
+15 -15
View File
@@ -2,16 +2,16 @@
「堆 Heap」是一棵限定条件下的「完全二叉树」。根据成立条件,堆主要分为两种类型:
- 「大顶堆 Max Heap」,任意点的值 $\geq$ 其子点的值;
- 「小顶堆 Min Heap」,任意点的值 $\leq$ 其子点的值;
- 「大顶堆 Max Heap」,任意点的值 $\geq$ 其子点的值;
- 「小顶堆 Min Heap」,任意点的值 $\leq$ 其子点的值;
![小顶堆与大顶堆](heap.assets/min_heap_and_max_heap.png)
## 堆术语与性质
- 由于堆是完全二叉树,因此最底层点靠左填充,其它层点皆被填满。
- 二叉树中的根点对应「堆顶」,底层最靠右点对应「堆底」。
- 对于大顶堆 / 小顶堆,其堆顶元素(即根点)的值最大 / 最小。
- 由于堆是完全二叉树,因此最底层点靠左填充,其它层点皆被填满。
- 二叉树中的根点对应「堆顶」,底层最靠右点对应「堆底」。
- 对于大顶堆 / 小顶堆,其堆顶元素(即根点)的值最大 / 最小。
## 堆常用操作
@@ -308,9 +308,9 @@
在二叉树章节我们学过,「完全二叉树」非常适合使用「数组」来表示,而堆恰好是一棵完全二叉树,**因而我们采用「数组」来存储「堆」**。
**二叉树指针**。使用数组表示二叉树时,元素代表点值,索引代表点在二叉树中的位置,**而点指针通过索引映射公式来实现**。
**二叉树指针**。使用数组表示二叉树时,元素代表点值,索引代表点在二叉树中的位置,**而点指针通过索引映射公式来实现**。
具体地,给定索引 $i$ ,那么其左子点索引为 $2i + 1$ 、右子点索引为 $2i + 2$ 、父点索引为 $(i - 1) / 2$ (向下整除)。当索引越界时,代表空点或点不存在。
具体地,给定索引 $i$ ,那么其左子点索引为 $2i + 1$ 、右子点索引为 $2i + 2$ 、父点索引为 $(i - 1) / 2$ (向下整除)。当索引越界时,代表空点或点不存在。
![堆的表示与存储](heap.assets/representation_of_heap.png)
@@ -418,7 +418,7 @@
### 访问堆顶元素
堆顶元素是二叉树的根点,即列表首元素。
堆顶元素是二叉树的根点,即列表首元素。
=== "Java"
@@ -482,9 +482,9 @@
### 元素入堆
给定元素 `val` ,我们先将其添加到堆底。添加后,由于 `val` 可能大于堆中其它元素,此时堆的成立条件可能已经被破坏,**因此需要修复从插入点到根点这条路径上的各个点**,该操作被称为「堆化 Heapify」。
给定元素 `val` ,我们先将其添加到堆底。添加后,由于 `val` 可能大于堆中其它元素,此时堆的成立条件可能已经被破坏,**因此需要修复从插入点到根点这条路径上的各个点**,该操作被称为「堆化 Heapify」。
考虑从入堆点开始,**从底至顶执行堆化**。具体地,比较插入点与其父点的值,若插入点更大则将它们交换;并循环以上操作,从底至顶地修复堆中的各个点;直至越过根点时结束,或当遇到无需交换的点时提前结束。
考虑从入堆点开始,**从底至顶执行堆化**。具体地,比较插入点与其父点的值,若插入点更大则将它们交换;并循环以上操作,从底至顶地修复堆中的各个点;直至越过根点时结束,或当遇到无需交换的点时提前结束。
=== "<1>"
![元素入堆步骤](heap.assets/heap_push_step1.png)
@@ -504,7 +504,7 @@
=== "<6>"
![heap_push_step6](heap.assets/heap_push_step6.png)
点总数为 $n$ ,则树的高度为 $O(\log n)$ ,易得堆化操作的循环轮数最多为 $O(\log n)$ ,**因而元素入堆操作的时间复杂度为 $O(\log n)$** 。
点总数为 $n$ ,则树的高度为 $O(\log n)$ ,易得堆化操作的循环轮数最多为 $O(\log n)$ ,**因而元素入堆操作的时间复杂度为 $O(\log n)$** 。
=== "Java"
@@ -588,13 +588,13 @@
### 堆顶元素出堆
堆顶元素是二叉树根点,即列表首元素,如果我们直接将首元素从列表中删除,则二叉树中所有点都会随之发生移位(索引发生变化),这样后续使用堆化修复就很麻烦了。为了尽量减少元素索引变动,采取以下操作步骤:
堆顶元素是二叉树根点,即列表首元素,如果我们直接将首元素从列表中删除,则二叉树中所有点都会随之发生移位(索引发生变化),这样后续使用堆化修复就很麻烦了。为了尽量减少元素索引变动,采取以下操作步骤:
1. 交换堆顶元素与堆底元素(即交换根点与最右叶点);
1. 交换堆顶元素与堆底元素(即交换根点与最右叶点);
2. 交换完成后,将堆底从列表中删除(注意,因为已经交换,实际上删除的是原来的堆顶元素);
3. 从根点开始,**从顶至底执行堆化**
3. 从根点开始,**从顶至底执行堆化**
顾名思义,**从顶至底堆化的操作方向与从底至顶堆化相反**,我们比较根点的值与其两个子点的值,将最大的子点与根点执行交换,并循环以上操作,直到越过叶点时结束,或当遇到无需交换的点时提前结束。
顾名思义,**从顶至底堆化的操作方向与从底至顶堆化相反**,我们比较根点的值与其两个子点的值,将最大的子点与根点执行交换,并循环以上操作,直到越过叶点时结束,或当遇到无需交换的点时提前结束。
=== "<1>"
![堆顶元素出堆步骤](heap.assets/heap_pop_step1.png)