資料結構系列 堆(C C 實現)

2021-09-19 07:00:58 字數 2926 閱讀 7807

三、c++實現

1、定義:最小堆,是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於其左子節點和右子節點的值。

2、特性(2個)

(1)結構性:它是能用陣列表示的完全二叉樹

(2)堆序性:任一結點的關鍵字是其子樹所有結點的最大值(最大堆)或最小值(最小堆),即任意子樹也應該是個堆。

3、適用

4、實現:使用含有哨兵元素的陣列實現了最小堆的建立、插入和刪除,完全二叉樹之所以用陣列的方式存在,在於他的乙個特性 若子節點為i,則父節點為(i-1)/2,若父節點為j,則子節點必為2*j+1;則在陣列裡面可以非常方便的通過下標去獲取。

二叉堆一般使用陣列來表示。請回憶一下二叉樹的性質,其中有一條性質:

如果對一棵有n個節點的完全二叉樹的節點按層序編號,對任一節點i有:

如果i=1 ,則節點為根節點,沒有雙親。

如果2 * i > n ,則節點i沒有左孩子 ;否則其左孩子節點為2i . (n為節點總數)

如果2 * i+1>n ,則節點i沒有右孩子;否則其右孩子節點為21+1.

#include #include #define mindata -100//哨兵元素的值

typedef struct heapstruct *minheap;

//初始化

minheap init_minheap(int maxsize);

//是否裝滿

int isfull(minheap h);

//是否為空

int isempty(minheap h);

//插入

void insert(minheap h, int data);

//刪除

int delete(minheap h);

//建立

void buildminheap(minheap h, int n);

//列印

void printvalue(minheap h);

#include "heapfun.h"

//建立最小堆

void buildminheap(minheap h, int n)

h->size = n;

root = n/2;

while (root)

h->p[parent] = lastvalue;

--root;

}}//初始化最小堆:該函式給最小堆分配了記憶體空間並完成初始化操作,此時最小堆中元素為空。

minheap init_minheap(int maxsize)

//插入最小堆

void insert(minheap h, int data)

h->p[i] = data;

}//刪除最小堆中最小元素

int delete(minheap h)

h->p[parent] = lastvalue;

return minvalue;

}//列印

void printvalue(minheap h)

}//判斷是否裝滿

int isfull(minheap h)

//判斷是否為空

int isempty(minheap h)

void main()

;

/*從下到上調整堆*/

/*插入元素時候使用*/

template void maxheap::filterup(int index)

}heap[index] = value; //12插入最後的位置

};/*插入元素*/

template bool maxheap::insert(t val)

;*從上到下調整堆*/

/*刪除元素時候使用*/

templatevoid maxheap::filterdown(int current,int end)

}heap[current] = value;

};/*刪除元素*/

templatebool maxheap::remove(t data)

if (index == size) //陣列中沒有該值

return false;

heap[index] = heap[size - 1]; //使用最後乙個節點來代替當前結點,然後再向下調整當前結點。

filterdown(index,size--);

return true;

};*列印大頂堆*/

template void maxheap::print()

;/*獲取堆頂元素*/

template t maxheap::gettop()

;/*根據指定的陣列來建立乙個最大堆*/

templatebool maxheap::createmapheap(t a, int size)

return true;

};

int _tmain(int argc, _tchar* ar**)

heap.print();

cout << endl;

heap.remove(8);

heap.print();

cout << endl;

//根據指定的陣列建立大頂堆

maxheapheap2(11);

int a[10] = ;

heap2.createmaxheap(a, 10);

heap2.print();

getchar();

return 0;

}

資料結構 堆的實現

普通的模板引數 template struct less template struct greater template 預設為小堆 class heap heap const t array,size t size int root heap.size 2 1 for root 0 root s...

(資料結構)堆的實現

堆總是一棵完全二叉樹 且 最大堆總滿足,堆中父節點的值總是大於等於其左右子節點的值 最小堆總滿足,堆中父節點的值總是小於等於其左右子節點的值。1.資料儲存 如下圖所示,如果自頂向下,自左向右依次將完全二叉樹中的每個節點標上序號 注 此處從1開始 並使用陣列儲存 注 陣列中下標0對應的位置未放置元素 ...

資料結構 堆(python實現)

資料結構 堆 python實現 用list來儲存堆元素,表尾端加入元素,首段作為堆頂 借鑑裘老師資料結構與演算法的書加上自己的理解 堆 就是乙個完全二叉樹 class heap object def init self,elist self.elems list elist if elist sel...