Unverified Commit db37e2ab authored by ir1d's avatar ir1d Committed by GitHub
Browse files

fix: 二叉堆:把小根堆改成大根堆 (#1340)

fix: 二叉堆:把小根堆改成大根堆
parents f4130cf8 e630413f
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -2,13 +2,13 @@

从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。

堆性质:父亲的权值不于儿子的权值(小根堆)
堆性质:父亲的权值不于儿子的权值(大根堆)。同样的,我们可以定义小根堆。本文以大根堆为例

由堆性质,树根存的是最值(getmin 操作就解决了)。
由堆性质,树根存的是最值(getmax 操作就解决了)。

### 插入操作

首先,要保证插入后也是一棵完全二叉树。
插入操作是指向二插堆中插入一个元素,要保证插入后也是一棵完全二叉树。

最简单的方法就是,最下一层最右边的叶子之后插入。

@@ -16,7 +16,7 @@

插入之后可能会不满足堆性质?

向上调整:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。
**向上调整**:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。

可以证明,插入之后向上调整后,没有其他结点会不满足堆性质。

@@ -24,9 +24,9 @@

### 删除操作

删除根结点。
删除操作指删除堆中最大的元素,即删除根结点。

如果直接删除,则变成了两个堆,难以处理。
但是如果直接删除,则变成了两个堆,难以处理。

所以不妨考虑插入操作的逆过程,设法将根结点移到最后一个结点,然后直接删掉。

@@ -34,7 +34,7 @@

于是直接删掉(在最后一个结点处的)根结点,但是新的根结点可能不满足堆性质……

向下调整:在该结点的所有儿子中,找一个最小的,与该结点交换,重复此过程直到底层。
**向下调整**:在该结点的所有儿子中,找一个最小的,与该结点交换,重复此过程直到底层。

可以证明,删除并向下调整后,没有其他结点不满足堆性质。