数据结构与算法(二十八)

二叉堆

一,基本操作与准备知识:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 子节点总是比父节点大
  • 二叉堆的下标性质要求根节点下标必须为1,因此下标为零的项不用

二叉堆操作的实现:

1,二叉堆初始化:

#二叉堆的实现:

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

2,二叉堆——insert(key)方法:

    def percUp(self,i): #上浮方法上浮到不能再上浮
        while i//2 > 0:
            if self.heapList[i] < self.heapList[i//2]:
                tmp = self.heapList[i//2]
                self.heapList[i//2] = self.heapList[i]
                self.heapList[i] = tmp
            i = i//2
    def insert(self,k): #插入方法
        self.heapList.append(k)
        self.currentSize = self.currentSize + 1
        self.percUp(self.currentSize)

3,二叉堆——delMin()方法:

    def percDown(self,i):#下沉方法——沉得不能再沉了
        while (i*2) <= self.currentSize:
            mc = self.minChild(i)
            if self.heapList[i] > self.heapList[mc]:
                tmp = self.heapList[i]
                self.heapList[i] = self.heapList[mc]
                self.heapList[mc] = tmp
            i = mc

    def minChild(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

    def delMin(self):
        retval = self.heapList[1]
        self.heapList[1] = self.heapList[self.currentSize]#将最新叶节点的值赋值给根节点
        self.currentSize = self.currentSize - 1
        self.heapList.pop()#将最后一项删除
        self.percDown(1) #新顶下沉
        return retval


4,二叉堆——buildHeap(lst)方法:

    def buildHeap(self,alist):
        i = len(alist)//2 #从最后节点的父节点开始下沉,因为叶节点无法下沉
        self.currentSize = len(alist)
        self.heapList = [0]+alist[:]
        print(len(self.heapList),i)
        while (i>0):
            print(self.heapList,i)
            self.percDown(i)
            i = i-1
        print(self.heapList,i)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值