堆的基本操作

2021-09-19 16:46:21 字數 1293 閱讀 6942

堆:邏輯上是一顆完全二叉樹

物理上是陣列的形式 ,順序儲存

作用:找陣列中的前k大的值

特點:​ 大頂堆:任意乙個root的值》=左右子樹的值

​ 小頂堆:任意乙個root的值<=左右子樹的值

–要調整root所在的節點

前提:root的左右子樹都已滿足堆的性質

如果root所在的節點已經是葉子結點,調整結束

找到左右孩子中較小的乙個min

堆的基本操作(以大頂堆為例)

查詢堆元素的父節點,左右子樹節點:

//陣列下標為0的元素也儲存資料的情況

//返回完全二叉樹的陣列表示中,

// 乙個索引表示的元素的父親節點的索引

private int parent(int index)

//返回完全二叉樹的陣列表示中,

// 乙個索引表示的元素的左孩子節點的索引

private int leftchild(int index)

//返回完全二叉樹的陣列表示中,

// 乙個索引表示的元素的右孩子節點的索引

private int rightchild(int index)

新增元素:

//向堆中新增元素

public void add(e e)

private void siftup(int k)

}

//交換元素:使用collections工具類的swap方法

private void swap(int i,int j)
取出堆中最大元素:

//檢視堆中最大元素(堆頂)

public e peek()

//取出堆中最大元素(刪除)

public e extractmax()

private void siftdown(int k)

if(data.get(k).compareto(data.get(j)) >= 0)

swap(k,j);

k = j;

}}

replace方法,替換堆頂元素

//取出堆中最大元素,並替換為元素e

public e replace(e e)

heapify方法,將傳入的陣列改造為堆

//將任意陣列整理成堆的形狀

public void heapify(integer arr)

}

堆的基本操作

堆的基本概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 如下圖 分別為小堆和大堆 堆的操作具體 如下 測試環境 vs201...

堆的基本操作

堆的資料結構 對於堆,有最大堆和最小堆,在定義乙個堆的時候用乙個陣列表示堆,同時為了方便定義堆的大小,用乙個 size 表示堆的有效元素,同時為了區別最大堆和最小堆,我們用乙個函式指標表示這個堆是最大堆還是最小堆.typedef int compare heaptype parent,heaptyp...

堆的基本操作

heap.h ifndef heap h define heap h 定義乙個函式指標 typedef int pf hdatatype left,hdatatype right typedef int hdatatype typedef struct heap heap int greater h...