python数据结构算法 堆列表实现

本文章是在学习二叉树并且了解了什么是堆和二叉查找树之后所写.

什么是堆?


堆是一种有着自身独特性质的二叉树.

第一:除了倒数第二层子节点可以不满外,其他层必有两个子节点(叶节点在最后一层,是没有子节点的).

第二:叶节点是从左往右排列

第三:(若为小顶堆,根节点最小)该节点的值一定小于其子节点的值,而兄弟节点之间没有大小关系

#下面来实现堆的插入和出队操作
‘’‘任一节点设为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(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值