利用完全二叉树的性质,如何创建一个大根堆和一个小根堆?

2023-11-22 19:59

本文主要是介绍利用完全二叉树的性质,如何创建一个大根堆和一个小根堆?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大根堆

大根堆:每个结点的值不大于他的父亲结点的值

分析如下:

假设对{ 27,15,19,18,28,34,65,49,25,37 }这样一个集合的数据创建成堆;

 

 

代码如下:

//建立大根堆
public class TestHeap{public int[] array;public int usedSize;//当前有效数组长度public TestHeap(){this.array = new int[10];this.usedSize = 0;}//初始化数组public void InitArray(int[] arrayClone){array = Arrays.copyOf(arrayClone, arrayClone.length);usedSize = array.length;}//创建大根堆public void createHeap(){for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){adjustment(parent, usedSize);}}//调整public void adjustment(int parent, int len){//左子树结点下标int child = parent * 2 + 1;//调整while(child < len){//先判断有没有右孩子,如果右,找出最大值if(child + 1 < len && array[child] < array[child + 1]){child++;//如果右子树大,child++就指向他,如果左子树大,就不用管,直接进行下一步判断交换}//若左右子树的最大值大于父亲结点则交换if(array[child] > array[parent]){swap(array, child, parent);parent = child;child = parent * 2 + 1;} else{break;}}}//交换public void swap(int[] array, int child, int parent){int tmp = array[child];array[child] = array[parent];array[parent] = tmp;}
}

小根堆

小根堆:每个结点的值不小于他的父亲结点的值

     分析与大根堆类似,只是比较出更小的进行替换

代码如下:

//建立大根堆
public class TestHeap{public int[] array;public int usedSize;//当前有效数组长度public TestHeap(){this.array = new int[10];this.usedSize = 0;}//初始化数组public void InitArray(int[] arrayClone){array = Arrays.copyOf(arrayClone, arrayClone.length);usedSize = array.length;}//创建大根堆public void createHeap(){for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){adjustment(parent, usedSize);}}//调整public void adjustment(int parent, int len){//左子树结点下标int child = parent * 2 + 1;//调整while(child < len){//先判断有没有右孩子,如果右,找出最小值if(child + 1 < len && array[child] > array[child + 1]){child++;//如果右子树小,child++就指向他,如果左子树小,就不用管,直接进行下一步判断交换}//若左右子树的最大值小于父亲结点则交换if(array[child] < array[parent]){swap(array, child, parent);parent = child;child = parent * 2 + 1;} else{break;}}}//交换public void swap(int[] array, int child, int parent){int tmp = array[child];array[child] = array[parent];array[parent] = tmp;}
}

这篇关于利用完全二叉树的性质,如何创建一个大根堆和一个小根堆?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412547

相关文章

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

Regionals 2004 Asia - Beijing Argus 小根堆

点击打开链接 小根堆 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokeni

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06