堆满足的条件
- 必须是完全二叉树
- 各个父节点必须大于或者小于左右节点,其中最顶层的根结点必须是最大或者最小的
实现方式及条件
- 使用数组实现二叉堆,例如下图的最大堆,在数组中使用[0,100,90,85,80,30,60,50,55]存储,注意上述第一个元素0仅仅是做占位;
- 设节点位置为x,则左节点位置为2x,右节点在2x+1;已知叶子节点x,根节点为x//2;
- 举例说明:
- 100为根节点(位置为1),则左节点位置为2,即90,右节点位置为3,即85;
- 30为子节点(位置为5),则根节点为(5//2=2),即90;
根据上述条件,我们可以绘制出堆的两种形式
源码
-
最大堆
# -*- encoding:UTF-8 -*- class MaxHeap(): '''最大堆的实现''' def __init__(self): '''初始化-使用列表实现''' self.heaplist = [0] self.heaphigh = 0 def insert(self,data): '''插入元素''' self.heaplist.append(data) self._dataUp() self.heaphigh += 1 print(self.heaplist, self.heaphigh) def _dataUp(self): '''插入元素-上浮操作''' high = len(self.heaplist)-1 while high > 1 : index = high // 2 if self.heaplist[high] > self.heaplist[index]: self.heaplist[high],self.heaplist[index] = self.heaplist[index], self.heaplist[high] high = index return self.heaplist def del_max(self): '''删除最大值''' self._dataDown() self.heaplist.pop() self.heaphigh -= 1 print(self.heaplist,self.heaphigh) def _dataDown(self): '''删除元素-下沉操作''' index = 1 high = len(self.heaplist) data = self.heaplist[-1] while 2*index+1 < high: if self.heaplist[2*index] > self.heaplist[2*index+1]: if self.heaplist[2*index] > data: self.heaplist[index],self.heaplist[2*index] = self.heaplist[2*index],data index *= 2 else: return self.heaplist else: if self.heaplist[2*index+1] > data: self.heaplist[index],self.heaplist[2*index+1] = self.heaplist[2*index+1],data index = 2*index+1 else: return self.heaplist @property def find_max(self): '''返回最大元素''' return None if self.heaphigh == 0 else self.heaplist[1] @property def is_empty(self): return True if self.heaphigh == 0 else False @property def size(self): '''返回长度''' return None if self.heaphigh == 0 else self.heaphigh
-
最小堆
# -*- encoding:UTF-8 -*- class MinHeap(): '''最小堆的实现''' def __init__(self): '''初始化-使用列表实现''' self.heaplist = [0] self.heaphigh = 0 def insert(self,data): '''插入元素''' self.heaplist.append(data) self._dataUp() self.heaphigh += 1 print(self.heaplist, self.heaphigh) def _dataUp(self): '''插入元素-上浮操作''' high = len(self.heaplist)-1 while high > 1 : index = high // 2 if self.heaplist[high] < self.heaplist[index]: self.heaplist[high],self.heaplist[index] = self.heaplist[index], self.heaplist[high] high = index return self.heaplist def del_min(self): '''删除最小值''' self._dataDown() self.heaplist.pop() self.heaphigh -= 1 print(self.heaplist,self.heaphigh) def _dataDown(self): '''删除元素-下沉操作''' index = 1 high = len(self.heaplist) data = self.heaplist[-1] while 2*index+1 < high: if self.heaplist[2*index] < self.heaplist[2*index+1]: if self.heaplist[2*index] < data: self.heaplist[index],self.heaplist[2*index] = self.heaplist[2*index],data index *= 2 else: return self.heaplist else: if self.heaplist[2*index+1] < data: self.heaplist[index],self.heaplist[2*index+1] = self.heaplist[2*index+1],data index = 2*index+1 else: return self.heaplist @property def find_min(self): '''返回最小元素''' return None if self.heaphigh == 0 else self.heaplist[1] @property def is_empty(self): return True if self.heaphigh == 0 else False @property def size(self): '''返回长度''' return None if self.heaphigh == 0 else self.heaphigh