广告
返回顶部
首页 > 资讯 > 精选 >Java堆代码怎么写
  • 553
分享到

Java堆代码怎么写

2023-06-28 22:06:08 553人浏览 薄情痞子
摘要

这篇文章主要介绍了Java堆代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java堆代码怎么写文章都会有所收获,下面我们一起来看看吧。1、堆的定义①、它是完全二叉树,除了树的最后一层节点不需要是满的,

这篇文章主要介绍了Java堆代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java堆代码怎么写文章都会有所收获,下面我们一起来看看吧。

1、堆的定义

①、它是完全二叉树,除了树的最后一层节点不需要是满的,其它的每一层从左到右都是满的。注意下面两种情况,第二种最后一层从左到右中间有断隔,那么也是不完全二叉树。

Java堆代码怎么写

②、它通常用数组来实现。  

Java堆代码怎么写

这种用数组实现的二叉树,假设节点的索引值为index,那么:

节点的左子节点是 2*index+1,

节点的右子节点是 2*index+2,

节点的父节点是 (index-1)/2。

③、堆中的每一个节点的关键字都大于(或等于)这个节点的子节点的关键字。

这里要注意堆和前面说的二叉搜索树的区别,二叉搜索树中所有节点的左子节点关键字都小于右子节点关键字,在二叉搜索树中通过一个简单的算法就可以按序遍历节点。但是在堆中,按序遍历节点是很困难的,如上图所示,堆只有沿着从根节点到叶子节点的每一条路径是降序排列的,指定节点的左边节点或者右边节点,以及上层节点或者下层节点由于不在同一条路径上,他们的关键字可能比指定节点大或者小。所以相对于二叉搜索树,堆是弱序的。

2、遍历和查找

前面我们说了,堆是弱序的,所以想要遍历堆是很困难的,基本上,堆是不支持遍历的。

对于查找,由于堆的特性,在查找的过程中,没有足够的信息来决定选择通过节点的两个子节点中的哪一个来选择走向下一层,所以也很难在堆中查找到某个关键字。

因此,堆这种组织似乎非常接近无序,不过,对于快速的移除最大(或最小)节点,也就是根节点,以及能快速插入新的节点,这两个操作就足够了。

3、移除

移除是指删除关键字最大的节点(或最小),也就是根节点。

根节点在数组中的索引总是0,即maxnode = heapArray[0];

移除根节点之后,那树就空了一个根节点,也就是数组有了一个空的数据单元,这个空单元我们必须填上。

第一种方法:将数组所有数据项都向前移动一个单元,这比较费时。

第二种方法:

  • ①、移走根

  • ②、把最后一个节点移动到根的位置

  • ③、一直向下筛选这个节点,直到它在一个大于它的节点之下,小于它的节点之上为止。

具体步骤如下:

Java堆代码怎么写

图a表示把最后一个节点移到根节点,图b、c、d表示将节点向下筛选到合适的位置,它的合适位置在最底层(有时候可能在中间),图e表示节点在正确位置的情景。

注意:向下筛选的时候,将目标节点和其子节点比较,谁大就和谁交换位置。

4、插入

插入节点也很容易,插入时,选择向上筛选,节点初始时插入到数组最后第一个空着的单元,数组容量大小增一。然后进行向上筛选的算法。

注意:向上筛选和向下不同,向上筛选只用和一个父节点进行比较,比父节点小就停止筛选了。

Java堆代码怎么写

5、完整的Java堆代码

首先我们要知道用数组表示堆的一些要点。若数组中节点的索引为x,则:

节点的左子节点是 2*index+1,

节点的右子节点是 2*index+2,

节点的父节点是 (index-1)/2。

注意:"/" 这个符号,应用于整数的算式时,它执行整除,且得到是是向下取整的值。

package com.ys.tree.heap; public class Heap {         private Node[] heapArray;    private int maxSize;    private int currentSize;         public Heap(int mx) {        maxSize = mx;        currentSize = 0;        heapArray = new Node[maxSize];    }         public boolean isEmpty() {        return (currentSize == 0)? true : false;    }         public boolean isFull() {        return (currentSize == maxSize)? true : false;    }         public boolean insert(int key) {        if(isFull()) {            return false;        }        Node newNode = new Node(key);        heapArray[currentSize] = newNode;        trickleUp(currentSize++);        return true;    }    //向上调整    public void trickleUp(int index) {        int parent = (index - 1) / 2; //父节点的索引        Node bottom = heapArray[index]; //将新加的尾节点存在bottom中        while(index > 0 && heapArray[parent].geTKEy() < bottom.getKey()) {            heapArray[index] = heapArray[parent];            index = parent;            parent = (parent - 1) / 2;        }        heapArray[index] = bottom;    }         public Node remove() {        Node root = heapArray[0];        heapArray[0] = heapArray[--currentSize];        trickleDown(0);        return root;    }    //向下调整    public void trickleDown(int index) {        Node top = heapArray[index];        int largeChildIndex;        while(index < currentSize/2) { //while node has at least one child            int leftChildIndex = 2 * index + 1;            int rightChildIndex = leftChildIndex + 1;            //find larger child            if(rightChildIndex < currentSize &&  //rightChild exists?                    heapArray[leftChildIndex].getKey() < heapArray[rightChildIndex].getKey()) {                largeChildIndex = rightChildIndex;            }            else {                largeChildIndex = leftChildIndex;            }            if(top.getKey() >= heapArray[largeChildIndex].getKey()) {                break;            }            heapArray[index] = heapArray[largeChildIndex];            index = largeChildIndex;        }        heapArray[index] = top;    }    //根据索引改变堆中某个数据    public boolean change(int index, int newValue) {        if(index < 0 || index >= currentSize) {            return false;        }        int oldValue = heapArray[index].getKey();        heapArray[index].setKey(newValue);        if(oldValue < newValue) {            trickleUp(index);        }        else {            trickleDown(index);        }        return true;    }         public void displayHeap() {        System.out.println("heapArray(array fORMat): ");        for(int i = 0; i < currentSize; i++) {            if(heapArray[i] != null) {                System.out.print(heapArray[i].getKey() + " ");            }            else {                System.out.print("--");            }        }    }}class Node {    private int iData;    public Node(int key) {        iData = key;    }         public int getKey() {        return iData;    }         public void setKey(int key) {        iData = key;    }}

关于“Java堆代码怎么写”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java堆代码怎么写”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java堆代码怎么写

本文链接: https://www.lsjlt.com/news/321093.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java堆代码怎么写
    这篇文章主要介绍了Java堆代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java堆代码怎么写文章都会有所收获,下面我们一起来看看吧。1、堆的定义①、它是完全二叉树,除了树的最后一层节点不需要是满的,...
    99+
    2023-06-28
  • Java NIO代码怎么写
    这篇文章主要讲解了“Java NIO代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO代码怎么写”吧!Java代码:import java.io.IOExce...
    99+
    2023-06-17
  • java验证码代码怎么写
    以下是一个简单的Java验证码生成代码示例:```javaimport java.util.Random;public class ...
    99+
    2023-08-09
    java
  • java排序代码怎么写
    有很多种排序算法可以在Java中实现,以下是一些常见的排序算法的示例代码:1. 冒泡排序(Bubble Sort)```javapu...
    99+
    2023-08-17
    java
  • Java哈希法代码怎么写
    这篇文章主要介绍了Java哈希法代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java哈希法代码怎么写文章都会有所收获,下面我们一起来看看吧。1、哈希函数的引入大家都用过字典,字典的优点是我们可以通过...
    99+
    2023-06-28
  • java降序排序代码怎么写
    你可以使用 `Collections.sort()` 方法和 `Comparator` 接口来实现降序排序。以下是一个示例代码:``...
    99+
    2023-10-11
    java
  • Java归并排序代码怎么写
    本篇内容主要讲解“Java归并排序代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java归并排序代码怎么写”吧!归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,...
    99+
    2023-06-17
  • Java冒泡排序代码怎么写
    本篇内容介绍了“Java冒泡排序代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!冒泡排序是计算机的一种排序方法,它的时间复杂度为O(...
    99+
    2023-06-17
  • java实现时钟代码怎么写
    以下是一个简单的Java代码示例,用于实现一个时钟:```javaimport java.time.LocalTime;import...
    99+
    2023-08-29
    java
  • 怎么写出优雅的Java代码
    这篇文章主要讲解了“怎么写出优雅的Java代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么写出优雅的Java代码”吧!1.使用 IntelliJ IDEA 作为您的集成开发环境 (ID...
    99+
    2023-06-16
  • java实现线程代码怎么写
    在Java中,可以使用以下两种方式实现线程: 继承Thread类 public class MyThread extends Th...
    99+
    2023-10-28
    java
  • java玫瑰花束代码怎么写
    以下是一个简单的 Java 程序,它可以打印出一个玫瑰花束的图案:public class RoseBouquet {public ...
    99+
    2023-05-13
    java玫瑰花束 java
  • java特效网页代码怎么写
    Java特效网页代码的编写需要以下步骤:1.了解Java的基本语法和语言特性。2.选择一个合适的Java IDE(集成开发环境),例...
    99+
    2023-05-30
    java特效 java
  • java设为首页代码怎么写
    要将Java设为浏览器的首页,你可以使用以下代码:```javaimport java.util.prefs.Preferences...
    99+
    2023-08-12
    java
  • java欢迎界面代码怎么写
    以下是一个简单的Java欢迎界面代码示例:```javaimport java.util.Scanner;public class ...
    99+
    2023-08-12
    java
  • java防sql注入代码怎么写
    为了防止SQL注入攻击,您可以采取以下Java代码编写方法:1. 使用预编译的语句和参数化查询。```javaString sql ...
    99+
    2023-08-25
    java sql
  • Java算法之堆排序代码示例
    堆是一种特殊的完全二叉树,其特点是所有父节点都比子节点要小,或者所有父节点都比字节点要大。前一种称为最小堆,后一种称为最大堆。比如下面这两个: 那么这个特性有什么作用?既然题目是堆排序,那么肯定能用来排序。想要用堆排序首先要创建一...
    99+
    2023-05-30
    java 算法实例 ava
  • java稀疏数组的代码怎么写
    这篇文章主要介绍了java稀疏数组的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java稀疏数组的代码怎么写文章都会有所收获,下面我们一起来看看吧。稀疏组织当一个数组中大部分元素为0,或者为同一个值...
    99+
    2023-07-02
  • java添加记录的代码怎么写
    要向Java中的数据结构(如数组、列表、集合、映射等)添加记录,可以使用以下代码示例: 向数组中添加记录: // 定义一个数组 i...
    99+
    2023-10-27
    java
  • 怎么写Java让代码性能更高
    这篇文章主要介绍“怎么写Java让代码性能更高”,在日常操作中,相信很多人在怎么写Java让代码性能更高问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么写Java让代码性能更高”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作