国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結構(9)樹形結構——大頂堆、小頂堆

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結構(9)樹形結構——大頂堆、小頂堆。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

9.1.概述

?9.2.操作

9.2.1.插入

9.2.2.刪除

9.2.3.代碼實現(xiàn)


9.1.概述

概念:

根節(jié)點是自己所在子樹中的最值完全二叉樹。

根節(jié)點是所在子樹的最大值,稱為大頂堆。

根節(jié)點是所在子樹的最小值,稱為小頂堆。

堆的任何子樹的根節(jié)點到子樹上的任意節(jié)點,路徑上的節(jié)點都是有序的,大頂堆為降序,小頂堆為升序。

此處展示一個大頂堆:

數(shù)據(jù)結構(9)樹形結構——大頂堆、小頂堆

作用:

堆一般用來在大量數(shù)據(jù)中找到前N大或者前N小的數(shù)據(jù)。

存儲:

一般用數(shù)組來存儲堆,首先因為堆一般是從空樹開始建立的,不論如何操作其一定會是一顆完全二叉樹,不存在大量非葉子結點沒有左右孩子的情況,所以用數(shù)組來表示不會造成內(nèi)存浪費。其次堆的刪除操作需要從葉節(jié)點反向向根結點方向遍歷,鏈表結構不太好支持這種反向遍歷。

?9.2.操作

9.2.1.插入

堆的插入采用尾插法,新入堆的節(jié)點掛在最后一個葉節(jié)點上,然后往上?。ń粨Q位置)。

假設已有一顆樹,是按照44、25、31、18、10的插入順序建樹的。

假設插入的是20:

數(shù)據(jù)結構(9)樹形結構——大頂堆、小頂堆

?假設插入的是35:

數(shù)據(jù)結構(9)樹形結構——大頂堆、小頂堆

9.2.2.刪除

堆的刪除操作,從葉子結點開始刪除的話,直接刪除即可,不會有任何影響,只有在刪除非葉子結點時才要考慮進行結點間的調(diào)整,保持堆是大頂堆或者小頂堆。

堆在使用時每次彈出的都是堆頂?shù)臄?shù)據(jù),因此刪除操作都是針對堆頂元素的,此處以大頂堆的刪除操作為例:

用最末尾的葉節(jié)點替換根節(jié)點,然后新的根節(jié)點與左右孩子比較是否為最大值,若不為最大值,則與參與比較的三個節(jié)點中的最大值互換位置,然后遞歸以上過程,出口為到達葉節(jié)點或者到達合適位置。文章來源地址http://www.zghlxwxcb.cn/news/detail-462483.html

9.2.3.代碼實現(xiàn)

package linearStructure.tree.heap;

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

public class MaxTopHeap {
    //存儲堆的數(shù)組
    private int[] heap;
    //堆的最大存儲容量
    private int maxSize;
    //當前堆的存儲數(shù)量
    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;
    }

    // 獲取堆頂?shù)闹?    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;
    }
}

到了這里,關于數(shù)據(jù)結構(9)樹形結構——大頂堆、小頂堆的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 堆排序,以及大頂堆構造過程Java實現(xiàn)

    先上代碼,堆排序一直是稀里糊涂的。找了視頻,一看就明白了,自己動手擼了一下。 一般用數(shù)組構建一種堆的關系。在數(shù)組中 每個根節(jié)點的下標 root_index = left_child_index/2 root_index = right_child_index/2 -1; ? left_child_index = 2*root_index+1; right_child_index = 2*root_index+2; ? 記住這個關系,

    2024年02月09日
    瀏覽(13)
  • LeetCode、2542. 最大子序列的分數(shù)【中等,排序+小頂堆】

    LeetCode、2542. 最大子序列的分數(shù)【中等,排序+小頂堆】

    博主介紹:?目前全網(wǎng)粉絲2W+,csdn博客專家、Java領域優(yōu)質(zhì)創(chuàng)作者,博客之星、阿里云平臺優(yōu)質(zhì)作者、專注于Java后端技術領域。 涵蓋技術內(nèi)容:Java后端、算法、分布式微服務、中間件、前端、運維、ROS等。 博主所有博客文件目錄索引:博客目錄索引(持續(xù)更新) 視頻平臺:

    2024年01月18日
    瀏覽(43)
  • LeetCode·每日一題·1851. 包含每個查詢的最小區(qū)間·優(yōu)先隊列(小頂堆)

    LeetCode·每日一題·1851. 包含每個查詢的最小區(qū)間·優(yōu)先隊列(小頂堆)

    ? ? 離線查詢: ?輸入的結果數(shù)組queries[]是無序的。如果我們按照輸入的queries[]本身的順序逐個查看,時間復雜度會比較高。 于是,我們將queries[]數(shù)組按照數(shù)值大小,由小到大逐個查詢,這種方法稱之為離線查詢。 位運算: ?離線查詢的時候,queries[]可以按照數(shù)值大小逐個

    2024年02月16日
    瀏覽(20)
  • 數(shù)據(jù)結構與算法:樹形查找

    數(shù)據(jù)結構與算法:樹形查找

    左子樹結點值 根結點值 右子樹結點值 對二叉排序樹進行中序遍歷,可以得到一個遞增的有序數(shù)列 原理: 對于一個給定的二叉排序樹,如果要查找一個節(jié)點,可以按照以下步驟進行: 從根節(jié)點開始比較。 如果要查找的值等于當前節(jié)點的值,則找到了目標節(jié)點,返回該節(jié)點。

    2024年02月06日
    瀏覽(22)
  • 【數(shù)據(jù)結構】樹形結構所有路徑復原為鏈表

    【數(shù)據(jù)結構】樹形結構所有路徑復原為鏈表

    目錄 1. 樹形結構可視化 2. 樹形結構轉(zhuǎn)為鏈表 此目標是要還原樹形結構的所有路徑。樹形結構是一種常見的數(shù)據(jù)結構,它表示元素之間層次關系。在樹形結構中,每個節(jié)點可能擁有一個或多個子節(jié)點,形成了一個分層的結構。為了還原樹形結構的路徑,我們需要找到從根節(jié)點

    2024年02月06日
    瀏覽(26)
  • Java獲取樹形結構數(shù)據(jù)

    Java獲取樹形結構數(shù)據(jù)

    目錄 前言: 開發(fā)前準備: 數(shù)據(jù)庫: 實體類: VO對象: 代碼實現(xiàn): Controller層: Service層: 運行結果: 第二種 在日常的開發(fā)或者工作需求中,我們會用到樹形結構數(shù)據(jù)。樹形結構是一個比較常用的數(shù)據(jù)類型,一般多用于查詢包含父子類關系的數(shù)據(jù)。我們常常通過父級id和層

    2024年02月12日
    瀏覽(23)
  • 超大量數(shù)據(jù),前端樹形結構展示

    后端返回了50萬數(shù)據(jù),讓前端一次性展示成樹,之前用的ant-design-vue的tree插件,卡的死死的,經(jīng)過大量實驗,現(xiàn)發(fā)現(xiàn)三種樹可以支持如此大數(shù)量的數(shù)據(jù)。 目錄 第一種:vue-easy-tree 使用方式: 1.安裝插件 2.引入插件 全局引入 組件引入 3.使用 ?在使用虛擬滾動時,必須設置?no

    2024年01月21日
    瀏覽(27)
  • c語言數(shù)據(jù)結構——樹形結構之樹和二叉樹

    c語言數(shù)據(jù)結構——樹形結構之樹和二叉樹

    二叉樹有什么用? 二叉樹應用非常廣泛。 在操作系統(tǒng)源程序中,樹和森林被用來構造文件系統(tǒng)。我們看到的window和linux等文件管理系統(tǒng)都是樹型結構。在編譯系統(tǒng)中,如C編譯器源代碼中,二叉樹的中序遍歷形式被用來存放C 語言中的表達式。其次二叉樹本身的應用也非常多,

    2023年04月18日
    瀏覽(44)
  • java返回前端樹形結構數(shù)據(jù)(2種實現(xiàn)方式)

    0.思想 首先找到一級目錄(類別),然后從一級目錄(類別)遞歸獲取所有子目錄(類別),并組合成為一個“目錄樹” 1.普通實現(xiàn):controller層傳的是0層,就是一級目錄層,從這里開始往下遞歸。 2.stream流實現(xiàn): 3.實體類集合專VO類集合的工具類 入?yún)槲粗愋偷膶嶓w集合

    2024年02月04日
    瀏覽(28)
  • Java8 Stream流處理樹形結構數(shù)據(jù)

    參考資料 Java8新特性-使用Stream流遞歸實現(xiàn)遍歷樹形結構 ID為2,6,11的Menu 是 ID為1的Menu子節(jié)點 ID為3,4,5的Menu 是 ID為2的Menu子節(jié)點 ?? 注意 是下面這種寫法的一種更簡單的寫法

    2024年02月01日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包