※ 引述《forris (喬巴)》之銘言:
: 我現在有一串數列:3, 76, 11, 49, 25, 54, 66, 40, 32, 27
: 要做最大堆積,先把數列做成完整二元樹:
: 3(1)
: / \
: 76(2) 11(3)
: / \ / \
: 49(4) 25(5) 54(6) 66(7)
: / \ /
: 40(8)32(9)27(10)
: 之後的步驟要怎麼做阿? 是把最大子節點跟父節點對調嗎?
建max heap的方法有兩種,你採用的是bottom up,
建完CBT後,從最後一個有child的父點開始調整,
括號內為存在一維陣列的位置,
假設n個資料,就是從n/2取下限的那個點為root所構成的subtree開始調,
現在有10個,所以找5號的那個子樹
調成 27
/
25
再來換4號的,不需要調
3號調成 66
/ \
54 11
2號不需要調
1號調成 76 再檢查對調過的那個3,是否比二個child大
/ \
3 66
沒有的話就跟二個child裡大的那個換,然後繼續從對調過的子樹檢查,直到結束..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.217.234.101