用Python实现树形结构的二叉堆算法
二叉堆是一种树形结构,它符合以下两个性质:
- 它是一棵完全二叉树。
- 对于每个节点,它的值都不小于其左子树和右子树中所有节点的值(大根堆),或者不大于其左子树和右子树中所有节点的值(小根堆)。
二叉堆可以用数组来实现,具体来说,对于二叉堆中的第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()函数删除了堆中的最大值,每次删除后都会重新维护堆的性质。
相关文章