二叉堆的python函式實現 學習mark

2021-10-09 00:08:41 字數 2612 閱讀 7964

二叉堆本質上是一種完全二叉樹。

一般分為兩種型別:

最大堆最小堆

最大堆的任何乙個父節點的值,都大於或等於其左孩子和右孩子節點的值

最小堆的任何乙個父節點的值,都小於或等於其左孩子和右孩子節點的值

二叉堆的根節點,稱為堆頂

二叉堆的自我調整

對於二叉堆,我們可以:

插入節點

刪除節點

構建二叉樹

構建二叉堆,即把乙個無序的完全二叉樹調整為二叉堆

本質:讓所有飛葉子節點依次「下沉」

插入和刪除節點的時間複雜度均為o(logn)

構建二叉堆的時間複雜度為o(n)

【**實現】

#取自漫畫演算法,出版內容,轉引,非侵權

def

up_adjust

(array=

):""" 二叉堆的尾節點上浮操作

:param array: 原陣列

:return: none

"""child_index =

len(array)-1

parent_index =

(child_index -1)

//2# temp 儲存插入的葉子節點值,用於最後的賦值

temp = array[child_index]

while child_index >

0and temp < array[parent_index]

:# 無需真正交換,單向賦值即可

array[child_index]

= array[parent_index]

child_index = parent_index

parent_index =

(parent_index -1)

//2array[child_index]

= temp

defdown_adjust

(parent_index, length, array=

):""" 二叉堆的節點下沉操作

:param parent_index:待下沉的節點下標

:param length:堆的長度範圍

:param array: 原陣列

:return: none

"""# temp 儲存父節點值,用於最後的賦值

temp = array[parent_index]

child_index =

2* parent_index +

1while child_index < length:

# 如果有右孩子,且右孩子的值小於左孩子的值,則定位到右孩子

if child_index +

1< length and array[child_index +1]

< array[child_index]

: child_index +=

1# 如果父節點的值小於任何乙個孩子節點的值,則直接跳出

if temp <= array[child_index]

:break

# 無需真正交換,單向賦值即可

array[parent_index]

= child_index

parent_index = child_index

child_index =

2* child_index +

1 array[parent_index]

= temp

defbuild_heap

(array=

):""" 二叉堆的構建操作

:param array: 原陣列

:return: none

"""# 從最後乙個非葉子節點開始,依次下沉調整

for i in

range((

len(array)-2

)//2,

-1,-

1): down_adjust(i,

len(array)

, array)

my_array =

list([

1,3,

2,6,

5,7,

8,9,

10,0]

)up_adjust(my_array)

print

(my_array)

my_array =

list([

7,1,

3,10,

5,2,

8,9,

6])build_heap(my_array)

print

(my_array)

結果為:

"d:\program files (x86)\python\python.exe" d:

/03_algorithm/algorithm_python/demo_binary_heap.py[0

,1,2

,6,3

,7,8

,9,10

,5][

1,4,

5,8,

7,3,

8,9,

10]process finished with exit code 0

二叉堆的實現

include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...

二叉堆的實現

1.堆的概念 這裡只需要注意兩點 a.堆的儲存方式 就是順序儲存在陣列中,在二叉樹中表現為滿二叉樹 b.堆的用處 用於排序,查詢最大最小都非常方便 2.堆的實現 heapexception.h ifndef heapexception h define heapexception h class a...

二叉堆的實現

二叉堆是一種特殊的堆,二叉堆是完全二元樹 二叉樹 或者是近似完全二元樹 二叉樹 二叉堆有兩種 最大堆和最小堆。最大堆 父結點的鍵值總是大於或等於任何乙個子結點的鍵值 最小堆 父結點的鍵值總是小於或等於任何乙個子節點的鍵值。二叉堆一般都通過 陣列 來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定...