返回

二叉堆:一种特殊的数据结构,巧用堆排序

前端

二叉堆的定义

二叉堆是一种特殊的二叉树,具有两个特性:

  1. 它是一棵完全二叉树,表示树的每一层都有左侧和右侧子节点(除了最后一层的叶节点);
  2. 并且最后一层的叶节点尽可能都是左侧子节点,这叫作结构特性。

举个简单的例子:

      1
     /  \
    2    3
   / \   / \
  4   5 6   7

这就是一个二叉堆,它是一棵完全二叉树,并且最后一层的叶节点都集中在左侧。

二叉堆的类型

二叉堆主要分为两大类:最小二叉堆和最大二叉堆。

  • 最小二叉堆:在最小二叉堆中,每个节点的值都小于或等于其子节点的值。
  • 最大二叉堆:在最大二叉堆中,每个节点的值都大于或等于其子节点的值。

二叉堆的应用

二叉堆具有广泛的应用,包括:

  • 优先级队列:二叉堆可以实现优先级队列,在优先级队列中,元素按照优先级从高到低排序。
  • 堆排序:堆排序是一种基于二叉堆的排序算法,它具有平均时间复杂度为 O(n log n) 的高效性能。

二叉堆的实现

二叉堆可以通过数组或链表来实现,数组实现更为简单,且可以减少内存的使用。

以下是使用数组实现二叉堆的代码示例:

class BinaryHeap:
    def __init__(self):
        self.heap = []

    def insert(self, value):
        self.heap.append(value)
        self.heapify_up()

    def heapify_up(self):
        index = len(self.heap) - 1
        while index > 0:
            parent_index = (index - 1) // 2
            if self.heap[index] < self.heap[parent_index]:
                self.heap[index], self.heap[parent_index] = self.heap[parent_index], self.heap[index]
                index = parent_index
            else:
                break

    def extract_min(self):
        if len(self.heap) == 0:
            return None
        min_value = self.heap[0]
        self.heap[0] = self.heap.pop()
        self.heapify_down()
        return min_value

    def heapify_down(self):
        index = 0
        while index < len(self.heap):
            left_index = 2 * index + 1
            right_index = 2 * index + 2
            smallest_index = index
            if left_index < len(self.heap) and self.heap[left_index] < self.heap[smallest_index]:
                smallest_index = left_index
            if right_index < len(self.heap) and self.heap[right_index] < self.heap[smallest_index]:
                smallest_index = right_index
            if smallest_index != index:
                self.heap[index], self.heap[smallest_index] = self.heap[smallest_index], self.heap[index]
                index = smallest_index
            else:
                break

if __name__ == "__main__":
    heap = BinaryHeap()
    heap.insert(5)
    heap.insert(3)
    heap.insert(1)
    heap.insert(2)
    heap.insert(4)

    print(heap.extract_min())  # 1
    print(heap.extract_min())  # 2
    print(heap.extract_min())  # 3
    print(heap.extract_min())  # 4
    print(heap.extract_min())  # 5

二叉堆的总结

二叉堆是一种特殊的二叉树,它具有完全二叉树和结构特性的特点,并具有广泛的应用,例如优先级队列和堆排序。二叉堆的实现可以采用数组或链表,其中数组实现更为简单。通过数组实现二叉堆,我们可以轻松实现插入、删除和查找最小值等操作。