最小堆和最大堆采用完全二叉树的形式来存储不同数字的序列,在topK问题中有广泛应用。其满足中间节点大于左子树和右子树上所有节点值的特点,为保证其存储、查找和删除的遍历,通常采用数组的形式进行构建。

本文实现了最小堆和最大堆的构建、堆顶查找、堆顶删除、插入等基本功能。

  • 最小堆
class minBinaryHeap(object):def __init__(self):self.heap = [0]self.length = 0def isEmpty(self):return self.length == 0def insert(self, k):self.heap.append(k)self.length += 1i = self.lengthwhile i // 2 > 0:if self.heap[i // 2] > self.heap[i]:self.heap[i // 2], self.heap[i] = self.heap[i], self.heap[i // 2]i //= 2else:breakdef finMin(self):return self.heap[1]def delMin(self):# 删除最小堆对顶if self.isEmpty():raise ValueError("It is empty binary heap!")# 1. 将完全二叉树的最后一个元素挪至堆顶self.heap[1] = self.heap.pop()self.length -= 1# 2. 将堆顶进行下沉i = 1while i * 2 <= self.length:minIndex = i * 2if i * 2 + 1 <= self.length and self.heap[i * 2] > self.heap[i * 2 + 1]:minIndex = i * 2 + 1if self.heap[minIndex] < self.heap[i]:self.heap[i], self.heap[minIndex] = self.heap[minIndex], self.heap[i]else:breaki += 1def bulidHeap(self, nums: list):# 从中间节点开始,对每个元素采用下沉法找到位置assert self.length == 0self.heap = [0] + numsself.length = len(nums)i = self.length // 2while i > 0:j = iwhile j * 2 <= self.length:minIndex = j * 2if j * 2 + 1 <= self.length and self.heap[j * 2] > self.heap[j * 2 + 1]:minIndex = j * 2 + 1if self.heap[minIndex] < self.heap[j]:self.heap[j], self.heap[minIndex] = self.heap[minIndex], self.heap[j]else:breakj += 1i -= 1def size(self):return self.lengthdef __repr__(self):return str(self.heap[1:])
  • 最大堆
class maxBinaryHeap(object):def __init__(self):self.heap = [0]self.length = 0def isEmpty(self):return self.length == 0def insert(self, k):self.heap.append(k)self.length += 1i = self.lengthwhile i // 2 > 0:if self.heap[i // 2] < self.heap[i]:self.heap[i // 2], self.heap[i] = self.heap[i], self.heap[i // 2]i //= 2else:breakdef finMax(self):return self.heap[1]def delMax(self):# 删除最小堆对顶if self.isEmpty():raise ValueError("It is empty binary heap!")# 1. 将完全二叉树的最后一个元素挪至堆顶self.heap[1] = self.heap.pop()self.length -= 1# 2. 将堆顶进行下沉i = 1while i * 2 <= self.length:maxIndex = i * 2if i * 2 + 1 <= self.length and self.heap[i * 2] < self.heap[i * 2 + 1]:maxIndex = i * 2 + 1if self.heap[maxIndex] > self.heap[i]:self.heap[i], self.heap[maxIndex] = self.heap[maxIndex], self.heap[i]else:breaki += 1def bulidHeap(self, nums: list):# 从中间节点开始,对每个元素采用下沉法找到位置assert self.length == 0self.heap = [0] + numsself.length = len(nums)i = self.length // 2while i > 0:j = iwhile j * 2 <= self.length:maxIndex = j * 2if j * 2 + 1 <= self.length and self.heap[j * 2] < self.heap[j * 2 + 1]:maxIndex = j * 2 + 1if self.heap[maxIndex] > self.heap[j]:self.heap[j], self.heap[maxIndex] = self.heap[maxIndex], self.heap[j]else:breakj += 1i -= 1def size(self):return self.lengthdef __repr__(self):return str(self.heap[1:])

【二叉堆】实现最小堆和最大堆相关推荐

  1. 堆之最小堆、最大堆(java实现)

    文章目录 堆 图解 最大堆的api设计 最大堆代码实现 最小代码实现 堆 定义:堆是树型的一对多的数据结构,使用数组实现 对应完全二叉树 每个节点大于等于或者小于等于它的子节点 二叉树: 每个非叶子节 ...

  2. LeetCode Algorithm 530. 二叉搜索树的最小绝对差

    530. 二叉搜索树的最小绝对差 Ideas 前几天一直刷链表题,这道题刚看到的时候还有点懵,第一个想到的方法竟然是全排列,脑子瓦特了. 二叉树的题目基本上都得跟(前/中/后)序遍历扯点关系,一看是没 ...

  3. 力扣 二叉搜索树的最小绝对差

    力扣 二叉搜索树的最小绝对差 题目描述 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 输入: 1 3 / 2 输出: 1 解释: 最小绝对差为 1,其中 ...

  4. Suzy找到实习了吗 Day 21 | 二叉树进行中:530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先

    530. 二叉搜索树的最小绝对差 题目 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 .差值是一个正数,其数值等于两值之差的绝对值. solution # Defi ...

  5. 二叉堆(最小堆)(数据结构与算法分析的代码实现)

    "堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树" "因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链&qu ...

  6. 【高性能定时器】时间堆(最小堆)

    最小堆及其应用:时间堆 最小堆及其应用:时间堆 一. 堆 1. 概念 2. 最小堆的实现 3. 性质 4. 代码 二.时间堆 1. 概念简述 2. 实现细节 3. 代码 一. 堆 1. 概念 堆是一种 ...

  7. LeetCode简单题之二叉搜索树的最小绝对差/最小距离

    题目 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 差值是一个正数,其数值等于两值之差的绝对值. 示例 1: 输入:root = [4,2,6,1,3] 输出: ...

  8. 二叉搜索树-创建最小高度树(递归)

    题意: 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树. 这里回忆一下二叉搜索树的概念: 对于树中的所有子树都有,左子树上的值都小于根节点的值,右子树上的值 ...

  9. java 最小堆_Java最小堆实现

    package boke.heap1; /** * 堆结点 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 ...

  10. LeetCode 530二叉搜索树的最小绝对值差-简单

    给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 输入: 1\3/2 输出: 1 解释: 最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 ...

最新文章

  1. python 只执行一次_Python 定时任务实现只执行一次的方法
  2. 13走了,14来了,新的一年,新的开始。
  3. Docker安装gogs git仓库
  4. base64补等号规则说明
  5. nmon 安装和使用
  6. 安卓系统应用启动流程分析
  7. 链接选项 rpath 的原理和应用
  8. 容器控件StackPanel控件
  9. java android 服务器_Android/Java从服务器端下载图片
  10. JPA和Hibernate-条件与JPQL或HQL
  11. fastcgi与cgi的区别
  12. 资产信息自动化收集系统 Venux
  13. roller for little vGL
  14. Oracle 包详解(package)
  15. 区间调度问题(最大利润作业调度问题)
  16. 【2016.5.27】再见,软件工程,你好,软件工程。
  17. 基于ThinkPHP框架的学生管理系统+留言板后台管理系统
  18. MySQL面试试题(五)
  19. Android官网教你如何系统学习
  20. DW CC2019软件安装破解教程(附安装包下载)

热门文章

  1. 高斯模型混合模型–理论上可以拟合任意概率密度分布
  2. mybatis调用oracle视图
  3. 解决360安全卫士卸载不掉问题
  4. 【C++】结构体 - 定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体 const
  5. ubuntu16.04如何通过adb连接miui系统手机
  6. ubuntu adb配置手机
  7. HNOI2017 影魔
  8. PIE-engine 教程 ——NDVI和FVC计算时序分析以2013年-2020年福州市为例
  9. Codeforces Round #667 (Div. 3) abcd
  10. 济南职业学院计算机就业好吗,济南职业学院好不好?排名怎么样评价如何