本文章是在学习二叉树并且了解了什么是堆和二叉查找树之后所写.
什么是堆?
堆是一种有着自身独特性质的二叉树.
第一:除了倒数第二层子节点可以不满外,其他层必有两个子节点(叶节点在最后一层,是没有子节点的).
第二:叶节点是从左往右排列
第三:(若为小顶堆,根节点最小)该节点的值一定小于其子节点的值,而兄弟节点之间没有大小关系
#下面来实现堆的插入和出队操作
‘’‘任一节点设为i,则他的左子节点为2i,右子节点为2i+1,父节点为i//2
(i从1开始),所以可以用列表实现’’’
import random
class heap:#我写的是一个小顶堆,根节点最小
def __init__(self):
#初始化一个堆,将首位空出以更好的使用性质
self._list=[0]
进堆操作是先在列表尾部添加item,根据i//2找到对应父节点进行比较,item如果小一些则需要进行交换,交换完结束的条件是在整除还在队列中,或者换不了的时候直接break
def push(self,item):
#首先获得插入item对应的i
i=len(self._list)
#将item放入堆中
self._list.append(item)
#为了满足堆的性质现在进行比较,上移
while i//2>=1: #确保进来的时候,还在堆里面
#对应根节点下标
if self._list[i//2]>self._list[i]:
#交换位置
self._list[i//2],self._list[i]\
=self._list[i],self._list[i//2]
else:
#能进来说明item要大一些,或相等,这时候就不需要循环了
break
i=i//2
#创建对象
p=heap(