最近學習了怎樣構造最大堆和最小堆,小有收穫。
堆有兩個特性:
結構性:用陣列表示的完全二叉樹
有序性:任一結點的關鍵字是其子樹所有節點所有節點的最大值(最小值)
最大堆的初始化
struct heapstruct
;typedef struct heapstruct* maxheap;
maxheap create(int maxsize)//建立堆
堆的插入void insert(maxheap h,elementtype item)
i=++h->size;//插入的位置
for(;h->elements[i/2]1;i/=2)//(i>1)可省略
h->elements[i]=h->elements[i/2];
h->elements[i]=item;
}
堆的刪除elementtype delemax(maxheap h)//從最大堆中取出鍵值最大的元素並刪除
maxitem = h->elements[1];
//用最大堆中最後乙個元素從根節點開始向上過濾下層結點
temp=h->elements[h->size--];
for(parent=1;parent*2<=h->size;parent=child)
h->elements[parent]=temp;
return maxitem;
}
L2 012 關於堆的判斷 基本的堆操作
輸出樣例 ft ft就是字串處理很繁瑣別的還好。找到自己的父親的方式,先找到自己的位置,哪乙個i的heap i x,i 1對應的值就是父親的值 includeusing namespace std const int n 1000 5 int heap n 2 n void push int x c...
關於堆的判斷
將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 以及需要判斷的命題數。下一行給出區間 10000,10000 內的n個要被插入乙個初始為空的小頂堆的整數。之後m行,每行給出乙個...
關於堆的判斷
將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 以及需要判斷的命題數。下一行給出區間 10000,10000 內的n個要被插入乙個初始為空的小頂堆的整數。之後m行,每行給出乙個...