大頂堆的建立

2021-09-26 09:14:57 字數 1910 閱讀 3008

加入由乙個無序陣列:[9, 4, 8, 3, 5, 1, 2, 6, 7, 0]

思路:先將無序陣列構建成乙個完全二叉樹:

----------------------------------------------正 文 分 割 線----------------------------------------------

什麼是二叉樹?

二叉樹模型(圈裡的數字代表著標號,而不是實際存放的資料):

什麼是二叉樹:

二叉數是只擁有兩顆子樹的樹,兩顆子樹分別被稱為「左子樹「和」右子樹」.

什麼是堆?

堆是乙個特殊的完全二叉樹,並且;設有乙個堆頂編號為1的含有n個元素的堆,總是有以下的幾點特性:

從乙個無序完全二叉樹到乙個大/小頂堆主要靠的就是調整這個堆。

流程解析:

從最後乙個非葉子節點(數值為5的節點)開始,若父節點小於子節點,則互換他們兩的位置,如下:

然後依次從右至左,從下到上進行,下乙個便是數值為8的節點(這個節點沒有什麼變化),接下來是數值為 4 的節點:

但是這樣子會導致 新的數值為 4 的節點亂掉,所以需要再對 這個 數值為4的節點進行調整。如圖:

這樣就可以經行下一步的調整了,然後我們繼續對剩下的節點做相同的事情就ok啦。

import math

def adjust_heap(arr, i): # arr為佇列,i為非葉子節點的編號

length = len(arr)

k = 2 * i + 1 # k為左孩子的下標

if i >= length/2: # 擁有子節點的才能繼續往下走

return

if k + 1 < length: # 確定該右子節點是否存在

if arr[k] < arr[k + 1]: # 存在則比較左右子節點

k += 1 # 如果右子節點大於左子節點,則指向右子節點

print(i, k, arr[i], arr[k], sep = '*')

if arr[i] < arr[k]:

print(i,k, arr[i], arr[k],sep = '#')

arr[i], arr[k] = arr[k], arr[i] # 交換父子節點

print(i,k, arr[i], arr[k], sep = '#')

adjust_heap(arr, k) # 對交換的子節點進行修復

def build_big_heap(arr):

length = len(arr)

i = int(length/2) - 1

while i >= 0:

adjust_heap(arr, i)

i -= 1

if __name__ == "__main__":

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4]

build_big_heap(a)

print(a)

小頂堆及大頂堆的建立

首先明確堆是乙個完全二叉樹,小頂堆指根結點的值小於或等於左右子節點的值,大頂堆指根結點的值都大於或等於左右子節點的值 關於大小頂堆的建立更詳細的介紹 include include include include include include include include using names...

大頂堆小頂堆

堆通常是乙個可以被看做一棵完全二叉樹的陣列物件 如果對一棵有n個結點的完全二叉樹的結點按層序編號 從第1層到第 1層,每層從左到右 則對任一結點i 1 i n 有 1 如果i 1,則結點i無雙親,是二叉樹的根 如果i 1,則其雙親是結點。2 如果2i n,則結點i為葉子結點,無左孩子 否則,其左孩子...

堆排(大頂堆,小頂堆)

分類 資料結構 演算法相關 2009 10 15 12 26 2289人閱讀收藏 舉報汗,別人都說大小頂堆只是改改大於號的問題,可我的 從大頂堆只改動大於號調整為小頂堆竟然越界樂,掣肘!後來幾經更改才發現是傳參的問題 見 看來大頂堆改小頂堆不是 亦或是我rp出點問題?搞笑的是 磚頭 c b 竟然對越...