数据结构(9)树形结构——大顶堆、小顶堆

news2024/11/24 4:48:53

目录

9.1.概述

 9.2.操作

9.2.1.插入

9.2.2.删除

9.2.3.代码实现


9.1.概述

概念:

根节点是自己所在子树中的最值完全二叉树。

根节点是所在子树的最大值,称为大顶堆。

根节点是所在子树的最小值,称为小顶堆。

堆的任何子树的根节点到子树上的任意节点,路径上的节点都是有序的,大顶堆为降序,小顶堆为升序。

此处展示一个大顶堆:

作用:

堆一般用来在大量数据中找到前N大或者前N小的数据。

存储:

一般用数组来存储堆,首先因为堆一般是从空树开始建立的,不论如何操作其一定会是一颗完全二叉树,不存在大量非叶子结点没有左右孩子的情况,所以用数组来表示不会造成内存浪费。其次堆的删除操作需要从叶节点反向向根结点方向遍历,链表结构不太好支持这种反向遍历。

 9.2.操作

9.2.1.插入

堆的插入采用尾插法,新入堆的节点挂在最后一个叶节点上,然后往上浮(交换位置)。

假设已有一颗树,是按照44、25、31、18、10的插入顺序建树的。

假设插入的是20:

 假设插入的是35:

9.2.2.删除

堆的删除操作,从叶子结点开始删除的话,直接删除即可,不会有任何影响,只有在删除非叶子结点时才要考虑进行结点间的调整,保持堆是大顶堆或者小顶堆。

堆在使用时每次弹出的都是堆顶的数据,因此删除操作都是针对堆顶元素的,此处以大顶堆的删除操作为例:

用最末尾的叶节点替换根节点,然后新的根节点与左右孩子比较是否为最大值,若不为最大值,则与参与比较的三个节点中的最大值互换位置,然后递归以上过程,出口为到达叶节点或者到达合适位置。

9.2.3.代码实现

package linearStructure.tree.heap;

import java.util.ArrayList;
import java.util.List;

public class MaxTopHeap {
    //存储堆的数组
    private int[] heap;
    //堆的最大存储容量
    private int maxSize;
    //当前堆的存储数量
    private int heapSize;
    public MaxTopHeap(int maxSize) {
        this.heap = new int[maxSize];
        this.maxSize = maxSize;
        this.heapSize = 0;
    }
    // 判断是否为空的方法
    public boolean isEmpty() {
        return heapSize == 0;
    }

    // 判断是否填满
    public boolean isFull() {
        return heapSize == maxSize;
    }

    // 获取堆顶的值
    public int peek() throws Exception {
        if (heapSize == 0) {
            throw new Exception("heap is empty");
        }
        return heap[0];
    }

    // 往堆中添加值
    public void insert (int value) throws Exception {
        if (heapSize == maxSize) {
            throw new Exception("head is full");
        }
        heap[heapSize] = value;
        heapSize++;
        buildMaxHeap(heap);
    }

    // 删除堆顶值
    public int poll() throws Exception {
        if (heapSize == 0) {
            throw new Exception("heap is empty");
        }
        int ans = heap[0];
        swap(heap,0,--heapSize);
        buildMaxHeap(heap);
        return ans;
    }

    // 建大顶堆
    private int[] buildMaxHeap(int[] array) {
        for (int i = (heapSize-2)/2; i >= 0; i--) {
            adjustDownToUp(array,i,heapSize);
        }
        return array;
    }

    private void adjustDownToUp(int[] array, int index, int length) {
        int temp = array[index];
        for (int i = 2*index+1; i < length; i = 2*i+1) {
            if (i < length-1 && array[i] < array[i+1]) {
                i++;
            }
            if (temp >= array[i]) {
                break;
            } else {
                array[index] = array[i];
                index = i;
            }
        }
        array[index] = temp;
    }
    // 交换元素值
    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    // 获取所有元素
    public List<Integer> getAllElements() {
        List<Integer> ans = new ArrayList<>();
        for (int i = 0; i < heapSize; i++) {
            ans.add(heap[i]);
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android OpenGL ES 学习(七) – 纹理

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投屏 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

第二证券|11天9板,“超级面料”概念火爆,高管却偷偷减持

自带抗病毒特点的“超级面料”炽热&#xff0c;多家上市公司发表相关状况。 安奈儿11天9板收重视函 早盘&#xff0c;安奈儿再度涨停&#xff0c;短短11个交易日9个涨停板&#xff0c;累计涨幅到达127%。 昨日晚间&#xff0c;安奈儿收到深交所重视函。在重视函中&#xff0c…

【计算机毕业设计】72.房屋出租出售系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;房屋出租出售系统当然也不能排除在外。房屋出租出售系统是…

《绿色消费实施方案》的推出,释放出怎么样的信号,有无新的赛道

近日&#xff0c;国家发改委等七部门印发的《促进绿色消费实施方案》(以下简称《方案》)提出&#xff0c;探索实施全国绿色消费积分制度&#xff0c;鼓励地方结合实际建立本地绿色消费积分制度&#xff0c;以兑换商品、折扣优惠等方式鼓励绿色消费。鼓励各类销售平台制定绿色低…

C/C++语言 数据结构 创建邻接表存储的无向图及其邻接表的输出

目录 1.邻接表相关知识补充 2. 图的邻接存储表示 3.测试输入与输出样例 4.代码实现 4.1 创建无向图邻接表 4.2 输入无向图的邻接表 1.邻接表相关知识补充 定义&#xff1a; 对于图中每个顶点 vi&#xff0c;把所有邻接于 vi的顶点&#xff08;对有向图是将从vi出发的弧的弧头顶…

windows/linux命令行操作快捷方式

命令行快捷键 Ctrla&#xff1a;光标回到命令行首。 &#xff08;a&#xff1a;ahead&#xff09; Ctrle&#xff1a;光标回到命令行尾。 &#xff08;e&#xff1a;end&#xff09; Ctrlb&#xff1a;光标向行首移动一个字符。 &#xff08;b&#xff1a;backwards&#xff…

【模拟面试】23届本科生拿下字节/京东/网易研发offer,到底有多强?

这是一场模拟面试&#xff0c;面试选手是今年的应届生&#xff0c;拿下了字节/京东/网易的offer。 如果你想参加模拟面试欢迎私聊我&#xff0c;仅限后端&#xff0c;go语言更好。 下面可以看看这个同学的简历 我个人觉得挺不错的 总共问了几个问题 你们这个计费系统是干什么的…

想要精通算法和SQL的成长之路 - 判断子序列问题

想要精通算法和SQL的成长之路 - 判断子序列问题前言一. 判断子序列1.1 动态规划做法1.2 双指针二. 不同的子序列前言 想要精通算法和SQL的成长之路 - 系列导航 一. 判断子序列 原题链接 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字…

阿里p8实战总结SpringCloud微服务分布式系统文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

Interval Envision图像库,非常强大的图像功能

Interval Envision图像库被认为具有增强Borland和Embarcadero Delphi的能力&#xff0c;并为用户和开发人员提供非常强大的图像功能。该库能够为用户提供一个图像文件I/O&#xff0c;用于文件的流行格式、扫描、打印过程、ocr的接口&#xff0c;以及最终的图片处理&#xff0c;…

Linux文件系统——文件系统、挂载点、目录结构

目录 一、目录结构 1.1 基本介绍 1.2 详细说明目录作用 二、挂载点 一、目录结构 1.1 基本介绍 Linux是一切皆文件&#xff0c;将所用的东西当做文件处理 目录结构就是一个单一的树状结构 整个的目录树只有一个树根&#xff1a;/ 根目录 文件夹分门别类的放到根目录…

vue配置环境变量

vue配置环境变量目录概述需求&#xff1a;设计思路实现思路分析1.URL管理2.网页3.加载.env4.分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for c…

卷积神经网络kernel/filter/stride

【关于神经网络的学习】 【参考】&#xff1a;卷积核filter和kernal的区别 - 一杯明月 - 博客园 (cnblogs.com) 【参考】&#xff1a;(1条消息) 卷积神经网络的卷积核&#xff08;kernel&#xff09;、输入尺寸&#xff08;input&#xff09;、步长&#xff08;stride&#x…

[附源码]计算机毕业设计springboot学生疫情防控信息填报系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用frp进行内网穿透

frp概述 frp 是一个高性能的反向代理应用&#xff0c;可以帮助您轻松地进行内网穿透&#xff0c;对外网提供服务&#xff0c;支持 tcp, http, https 等协议类型&#xff0c;并且 web 服务支持根据域名进行路由转发。frp 采用 C/S 模式&#xff0c;将服务端部署在具有公网 IP 机…

Kafka - topic producer consumer 常用命令

Kafka常用命令 Topic相关 创建topic bin/kafka-topics.sh --create --zookeeper node02:2181 --replication-factor 1 --partitions 1 --topic testkafka3.3.1新版本就会提示不兼容&#xff0c;需要改用新版本 Exception in thread "main" joptsimple.Unrecogniz…

单链表初阶的两道基础题

初阶链表刷题翻转单链表&#xff08;链接在末尾&#xff09;链表的倒数第K个结点&#xff08;链接在末尾&#xff09;普通解法进阶解法注意&#xff01;&#xff01;&#xff01;学习的是解题的思维&#xff01; 翻转单链表&#xff08;链接在末尾&#xff09; 解题思路 如果给…

Java#31(不可变集合,Stream流和方法引用)

目录 一.创建不可变集合: 不可以被修改的集合 1.List接口创建不可变集合 2.Set接口创建不可变集合 3.Map接口创建不可变集合 二.Stream流 1.如何获取Stream流? 2.Stream流的中间方法 3.Stream流终结方法 三.方法引用 1.引用静态方法 2.引用成员方法 3.引用结构方法…

【Java学习】JavaWeb---Request Response

文章目录1. Request1. 1Request继承体系1.2 Request获取请求数据1.3 Request请求转发2. Response2. 1 Response设置响应数据功能介绍2. 2 Response完成重定向2. 3 Response响应字符数据2. 4 Response响应字节数据1. Request 1. 1Request继承体系 1.2 Request获取请求数据 1.3 …

制造企业如何借数字化能力进军万亿国际市场?

历时七十余载&#xff0c;中国建立了世界最完整的现代工业体系&#xff0c;实现了从“制造大国”向“制造强国”的历史性跨越&#xff0c;同时&#xff0c;这片土地也孕育了全球最庞大的自动化物流系统。 报告显示&#xff0c;从2012到2021年&#xff0c;中国社会物流总额和社…