mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-12 11:50:58 +00:00
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:
+15
-15
@@ -2,16 +2,16 @@
|
||||
|
||||
「堆 Heap」是一棵限定条件下的「完全二叉树」。根据成立条件,堆主要分为两种类型:
|
||||
|
||||
- 「大顶堆 Max Heap」,任意结点的值 $\geq$ 其子结点的值;
|
||||
- 「小顶堆 Min Heap」,任意结点的值 $\leq$ 其子结点的值;
|
||||
- 「大顶堆 Max Heap」,任意节点的值 $\geq$ 其子节点的值;
|
||||
- 「小顶堆 Min Heap」,任意节点的值 $\leq$ 其子节点的值;
|
||||
|
||||

|
||||
|
||||
## 堆术语与性质
|
||||
|
||||
- 由于堆是完全二叉树,因此最底层结点靠左填充,其它层结点皆被填满。
|
||||
- 二叉树中的根结点对应「堆顶」,底层最靠右结点对应「堆底」。
|
||||
- 对于大顶堆 / 小顶堆,其堆顶元素(即根结点)的值最大 / 最小。
|
||||
- 由于堆是完全二叉树,因此最底层节点靠左填充,其它层节点皆被填满。
|
||||
- 二叉树中的根节点对应「堆顶」,底层最靠右节点对应「堆底」。
|
||||
- 对于大顶堆 / 小顶堆,其堆顶元素(即根节点)的值最大 / 最小。
|
||||
|
||||
## 堆常用操作
|
||||
|
||||
@@ -308,9 +308,9 @@
|
||||
|
||||
在二叉树章节我们学过,「完全二叉树」非常适合使用「数组」来表示,而堆恰好是一棵完全二叉树,**因而我们采用「数组」来存储「堆」**。
|
||||
|
||||
**二叉树指针**。使用数组表示二叉树时,元素代表结点值,索引代表结点在二叉树中的位置,**而结点指针通过索引映射公式来实现**。
|
||||
**二叉树指针**。使用数组表示二叉树时,元素代表节点值,索引代表节点在二叉树中的位置,**而节点指针通过索引映射公式来实现**。
|
||||
|
||||
具体地,给定索引 $i$ ,那么其左子结点索引为 $2i + 1$ 、右子结点索引为 $2i + 2$ 、父结点索引为 $(i - 1) / 2$ (向下整除)。当索引越界时,代表空结点或结点不存在。
|
||||
具体地,给定索引 $i$ ,那么其左子节点索引为 $2i + 1$ 、右子节点索引为 $2i + 2$ 、父节点索引为 $(i - 1) / 2$ (向下整除)。当索引越界时,代表空节点或节点不存在。
|
||||
|
||||

|
||||
|
||||
@@ -418,7 +418,7 @@
|
||||
|
||||
### 访问堆顶元素
|
||||
|
||||
堆顶元素是二叉树的根结点,即列表首元素。
|
||||
堆顶元素是二叉树的根节点,即列表首元素。
|
||||
|
||||
=== "Java"
|
||||
|
||||
@@ -482,9 +482,9 @@
|
||||
|
||||
### 元素入堆
|
||||
|
||||
给定元素 `val` ,我们先将其添加到堆底。添加后,由于 `val` 可能大于堆中其它元素,此时堆的成立条件可能已经被破坏,**因此需要修复从插入结点到根结点这条路径上的各个结点**,该操作被称为「堆化 Heapify」。
|
||||
给定元素 `val` ,我们先将其添加到堆底。添加后,由于 `val` 可能大于堆中其它元素,此时堆的成立条件可能已经被破坏,**因此需要修复从插入节点到根节点这条路径上的各个节点**,该操作被称为「堆化 Heapify」。
|
||||
|
||||
考虑从入堆结点开始,**从底至顶执行堆化**。具体地,比较插入结点与其父结点的值,若插入结点更大则将它们交换;并循环以上操作,从底至顶地修复堆中的各个结点;直至越过根结点时结束,或当遇到无需交换的结点时提前结束。
|
||||
考虑从入堆节点开始,**从底至顶执行堆化**。具体地,比较插入节点与其父节点的值,若插入节点更大则将它们交换;并循环以上操作,从底至顶地修复堆中的各个节点;直至越过根节点时结束,或当遇到无需交换的节点时提前结束。
|
||||
|
||||
=== "<1>"
|
||||

|
||||
@@ -504,7 +504,7 @@
|
||||
=== "<6>"
|
||||

|
||||
|
||||
设结点总数为 $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>"
|
||||

|
||||
|
||||
Reference in New Issue
Block a user