二叉堆,本质上是一种完全二叉树。只是在完全二叉树地基础上有一些其他地特性
复习完全二叉树定义:
只要最后一个节点之前地所有非叶子节点都存在左孩子和右孩子,且所有叶子节点在同一层次上地二叉树就叫做完全二叉树。
二叉堆
最大堆(大顶堆)
最大堆地任何一个父结点的值。都大于或等于它左孩子或者右孩子地值
二叉堆的根节点叫做堆顶,最大堆的堆顶是整个堆中的最大元素
最小堆(小顶堆)
最大堆地任何一个父结点的值。都小于或等于它左孩子或者右孩子地值
二叉堆地根节点叫做堆顶,最小堆的堆顶是整个堆中的最小元素
二叉堆的golang实现
二叉堆的所有节点都存储在数组中
二叉堆也是一种完全二叉树,存储方式是顺序存储,不会浪费空间
以最小堆为例:
包含构建最小堆,添加元素及删除元素
package main
import "fmt"
type Heap struct {
slice []int
length int
}
// 二叉堆尾节点的上浮操作 O(logn)
func (m *Heap) upAdjust() {
if m.length <= 1 {
return //最多一个节点,不用操作
}
childIndex := m.length - 1 //尾节点索引
parentIndex := (childIndex - 1) / 2 //尾节点的父节点索引
temp := m.slice[childIndex]
for childIndex > 0 && temp < m.slice[parentIndex] {
m.slice[childIndex]