Loading docs/ds/binary-heap.md +7 −7 Original line number Diff line number Diff line Loading @@ -2,13 +2,13 @@ 从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。 堆性质:父亲的权值不大于儿子的权值(小根堆)。 堆性质:父亲的权值不小于儿子的权值(大根堆)。同样的,我们可以定义小根堆。本文以大根堆为例。 由堆性质,树根存的是最小值(getmin 操作就解决了)。 由堆性质,树根存的是最大值(getmin 操作就解决了)。 ### 插入操作 首先,要保证插入后也是一棵完全二叉树。 插入操作是指向二插堆中插入一个元素,要保证插入后也是一棵完全二叉树。 最简单的方法就是,最下一层最右边的叶子之后插入。 Loading @@ -16,7 +16,7 @@ 插入之后可能会不满足堆性质? 向上调整:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。 **向上调整**:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。 可以证明,插入之后向上调整后,没有其他结点会不满足堆性质。 Loading @@ -24,9 +24,9 @@ ### 删除操作 删除根结点。 删除操作指删除堆中最大的元素,即删除根结点。 如果直接删除,则变成了两个堆,难以处理。 但是如果直接删除,则变成了两个堆,难以处理。 所以不妨考虑插入操作的逆过程,设法将根结点移到最后一个结点,然后直接删掉。 Loading @@ -34,7 +34,7 @@ 于是直接删掉(在最后一个结点处的)根结点,但是新的根结点可能不满足堆性质…… 向下调整:在该结点的所有儿子中,找一个最小的,与该结点交换,重复此过程直到底层。 **向下调整**:在该结点的所有儿子中,找一个最小的,与该结点交换,重复此过程直到底层。 可以证明,删除并向下调整后,没有其他结点不满足堆性质。 Loading Loading
docs/ds/binary-heap.md +7 −7 Original line number Diff line number Diff line Loading @@ -2,13 +2,13 @@ 从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。 堆性质:父亲的权值不大于儿子的权值(小根堆)。 堆性质:父亲的权值不小于儿子的权值(大根堆)。同样的,我们可以定义小根堆。本文以大根堆为例。 由堆性质,树根存的是最小值(getmin 操作就解决了)。 由堆性质,树根存的是最大值(getmin 操作就解决了)。 ### 插入操作 首先,要保证插入后也是一棵完全二叉树。 插入操作是指向二插堆中插入一个元素,要保证插入后也是一棵完全二叉树。 最简单的方法就是,最下一层最右边的叶子之后插入。 Loading @@ -16,7 +16,7 @@ 插入之后可能会不满足堆性质? 向上调整:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。 **向上调整**:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。 可以证明,插入之后向上调整后,没有其他结点会不满足堆性质。 Loading @@ -24,9 +24,9 @@ ### 删除操作 删除根结点。 删除操作指删除堆中最大的元素,即删除根结点。 如果直接删除,则变成了两个堆,难以处理。 但是如果直接删除,则变成了两个堆,难以处理。 所以不妨考虑插入操作的逆过程,设法将根结点移到最后一个结点,然后直接删掉。 Loading @@ -34,7 +34,7 @@ 于是直接删掉(在最后一个结点处的)根结点,但是新的根结点可能不满足堆性质…… 向下调整:在该结点的所有儿子中,找一个最小的,与该结点交换,重复此过程直到底层。 **向下调整**:在该结点的所有儿子中,找一个最小的,与该结点交换,重复此过程直到底层。 可以证明,删除并向下调整后,没有其他结点不满足堆性质。 Loading