什麼是堆
堆是一棵具有特定性質的二叉樹
堆的基本要求是堆中所有節點的值必須大於等於(或者小於等於)其孩子節點的值
堆應該是一棵完全二叉樹
堆的表示
由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間
public
class
heap
private
int ary;
private
int size; //堆中元素個數
private
int capacity; //堆的大小
private heaptype heaptype; //堆的型別
/** * 建立堆
*@param heaptype 堆的型別
*@param capacity 堆的大小
*/public
heap(heaptype heaptype)
/***@param i 元素在陣列中的下標
*@return 父元素在陣列中的下標, 返回-1表示不存在雙親
*/private
intparentindex(int i)
return (i - 1) / 2;
}/**
*@param i 元素在陣列中的下標
*@return 左孩子在陣列中的下標, 返回-1表示不存在左孩子
*/private
intlchildindex(int i)
return left;
}/**
*@param i 元素在陣列中的下標
*@return 右孩子在陣列中的下標, 返回-1表示不存在右孩子
*/private
intrchildindex(int i)
return right;
}/**
*@return 獲得堆頂元素
*/public
inttop()
return ary[0];
}/**
* 最大堆堆化(下滲)
*@param i 節點下標
*/private
void
int l, r, max;
int temp;
l = lchildindex(i);
r = rchildindex(i);
if(l != -1 && ary[l] > ary[i])else
if(r != -1 && ary[r] > ary[max])
if(i != max)
}/**
* 最小堆堆化(下滲)
*@param i 節點下標
*/private
void
int l, r, min;
int temp;
l = lchildindex(i);
r = rchildindex(i);
if(l != -1 && ary[l] < ary[i])else
if(r != -1 && ary[r] < ary[min])
if(i != min)
}/**
*@return 刪除並返回堆頂元素
*/public
intremove()
int temp = ary[0];
ary[0] = ary[size--];
switch(heaptype)
return temp;
}/**
*@param i 最大堆指定元素上浮
*/private
void
int temp;
int p =parentindex(i);
if(p != -1 && ary[i] > ary[p])
}/**
*@param i 最小堆指定元素上浮
*/private
void
int temp;
int p =parentindex(i);
if(p != -1 && ary[i] < ary[p])
}//擴容
private
void
resizeheap(int newcapacity)
this.ary = new
int[capacity];
system.arraycopy(old_ary, 0, ary, 0, size);
}/**
* 插入元素
*@param data
*/public
void
add(int data)
++size;
ary[size - 1] = data;
switch(heaptype)
}/**
* 插入陣列
*@param data
*/public
void
add(int data)
for(int i = 0; i < n; i++)
switch(heaptype)
break;
default:
for(int i = parentindex(size - 1); i >= 0; i--)}}
/*** 清空堆
*/public
void
clear()
}
資料結構 堆(優先佇列)
一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...
資料結構 優先佇列(堆)
堆 堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 結構性質 堆總是一棵完全樹。堆序性 堆中某個節點的值總是不大於或不小於其父節點的值 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。堆的意義就在於 最快的找到最大 最小值,在堆結構中插入乙個值重新構造堆結構,取走最...
資料結構 堆 優先佇列
堆,實際上是乙個完全二叉樹,大概就是介個樣子。堆一般又分為大頂堆和小頂堆 實際上差不多。這裡就用小頂堆舉個例好了qwq 其實stl中的優先佇列已經有堆的作用了,但是手寫的堆也有一些自己的優勢。我們先來看看堆的一些常用操作。1.插入乙個數 2.求集合當中的最小值 3.刪除最小值 4.刪除任意乙個元素 ...