用Python实现树形结构的二叉堆算法

2023-04-11 00:00:00 python 算法 结构

二叉堆是一种树形结构,它符合以下两个性质:

  1. 它是一棵完全二叉树。
  2. 对于每个节点,它的值都不小于其左子树和右子树中所有节点的值(大根堆),或者不大于其左子树和右子树中所有节点的值(小根堆)。

二叉堆可以用数组来实现,具体来说,对于二叉堆中的第i个节点,其左子节点的下标是2i,右子节点的下标是2i+1,父节点的下标是i//2。

下面是用Python实现二叉堆的代码:

class BinaryHeap:
    def __init__(self):
        self.heapList = [0]
        self.currentSize = 0

    def insert(self, k):
        self.heapList.append(k)
        self.currentSize += 1
        self.percUp(self.currentSize)

    def percUp(self, i):
        while i // 2 > 0:
            if self.heapList[i] > self.heapList[i // 2]:
                self.heapList[i], self.heapList[i // 2] = self.heapList[i // 2], self.heapList[i]
            i = i // 2

    def delMax(self):
        retval = self.heapList[1]
        self.heapList[1] = self.heapList[self.currentSize]
        self.currentSize -= 1
        self.heapList.pop()
        self.percDown(1)
        return retval

    def percDown(self, i):
        while (i * 2) <= self.currentSize:
            mc = self.maxChild(i)
            if self.heapList[i] < self.heapList[mc]:
                self.heapList[i], self.heapList[mc] = self.heapList[mc], self.heapList[i]
            i = mc

    def maxChild(self, i):
        if (i * 2 + 1) > self.currentSize:
            return i * 2
        else:
            if self.heapList[i * 2] > self.heapList[i * 2 + 1]:
                return i * 2
            else:
                return i * 2 + 1

这个类中包含了二叉堆的基本操作,包括插入、删除最大值以及对节点进行上移和下移的操作。这些操作都是用来维护二叉堆的两个性质的。下面是一些测试代码,用来演示上述类的用法:

bh = BinaryHeap()
bh.insert(5)
bh.insert(7)
bh.insert(3)
bh.insert(11)
print(bh.delMax())
print(bh.delMax())
print(bh.delMax())
print(bh.delMax())

这些测试代码输出的结果是11、7、5和3,这是因为我们使用delMax()函数删除了堆中的最大值,每次删除后都会重新维护堆的性质。

相关文章