資料結構 大小堆的理解,建立,增加和刪除元素操作

2021-08-29 13:50:01 字數 1364 閱讀 1728

大小堆是基於完全二叉樹的結構;

大堆:任意乙個結點的左右孩子的資料都小於此結點的資料,位於堆頂的結點的資料最大。

小堆:任意乙個結點的左右孩子的資料都大於此結點的資料,位於堆頂的結點的資料最小。

下面以小堆為例,**:

以下都是以小堆為例

首先我們只會得到乙個陣列,並且我們知道堆最終形態是完全二叉樹。通過遞迴的思想,如果能把最後乙個以非葉子結點為根的樹變為小堆,然後改變倒數第二個以非葉子結點為根的樹,以此類推就可以將整個樹變為小堆。函式內需要用到向下調整法可看注釋:

void

adjustdown

(pheapstack phs,

int root)

//向下調整法,以phs為根節點的整棵樹變為大小堆

}void

creatheapstack

(pheapstack phs,heap_dt* array,

int arrsz,pcompare compare)

memcpy

(phs->data,array,arrsz*

sizeof

(heap_dt));

phs->sz = arrsz;

phs->dilatation = arrsz;

for(root=

((phs->sz-1-

1)>>1)

;root>=

0;root--

)//得到最後乙個非葉子節點的下標,進行迴圈

adjustdown

(phs,root)

;}

直接往原堆陣列的最後新增乙個元素,然後通過向上調整的方式。對新加的元素,它到根節點這條路上的所有樹都調整符合小堆的特性就好。

void

adjustup

(pheapstack phs,

int root)

}void

insertheap

(pheapstack phs,heap_dt d)

將要刪除的元素與堆陣列最後乙個元素的值交換,然後堆陣列數量減一,現在已經刪除了要刪除的元素,但是因為交換了元素值,小堆的性質被破壞。用向下調整的方法,從原本交換的結點位置開始,將以它為根的樹變為小堆。

void

adjustdown

(pheapstack phs,

int root)

}void

removeheap

(pheapstack phs)

資料結構 大小堆

如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹 的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或最大堆 最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵...

資料結構 大小堆的實現及堆排序

堆一般指二叉堆,結構如下 圈內數字指下標,圈外為內容,如圖現在並不能稱為乙個堆,因為它並不滿足大堆也不滿足小堆的組成,下面介紹大堆和小堆的簡答介紹和實現 大堆是指每個父節點的數都大於自己的每個孩子節點的值 用到的演算法是讓大數上移迴圈至完成大堆 void adjustup size t child ...

資料結構 簡單實現優先佇列(維護大小堆)

主要思想是堆排序裡面的維護大 小堆。top一直指向堆頂,而push pop要維護堆,pop出的值是top。注意 大根堆和小根堆只需要堆頂最大 小就行!偽 方法 push 引數 pop 下面引用自 24隻羊 堆和優先佇列 2.1 堆中新增元素和shift up 現在我們要新增元素52,先新增到索引為1...