Python实现数据结构之堆实现(4)

堆满足的条件

  • 必须是完全二叉树
  • 各个父节点必须大于或者小于左右节点,其中最顶层的根结点必须是最大或者最小的

实现方式及条件

  • 使用数组实现二叉堆,例如下图的最大堆,在数组中使用[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
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值