如果我插入的項目:陸續10,12,14,1,6成二進制最小堆一個項目怎麼會結果的樣子,我的問題是與以下插入元素二進制最小堆
當我開始我有:
10
然後
10
/
12
然後
10
/\
12 14
然後
1
/\
10 14
/
12
,但這是不正確的,那麼什麼是這樣做的正確方法?
注:這是一個家庭作業的問題,我試圖理解這個概念,如果你不舒服解決的問題(這是無論如何也全部問題),請提供類似的問題的例子。
如果我插入的項目:陸續10,12,14,1,6成二進制最小堆一個項目怎麼會結果的樣子,我的問題是與以下插入元素二進制最小堆
當我開始我有:
10
然後
10
/
12
然後
10
/\
12 14
然後
1
/\
10 14
/
12
,但這是不正確的,那麼什麼是這樣做的正確方法?
注:這是一個家庭作業的問題,我試圖理解這個概念,如果你不舒服解決的問題(這是無論如何也全部問題),請提供類似的問題的例子。
您必須將新元素添加爲子(或精確葉)到堆(不是root),這意味着你把它放在第一個「正確的」自由點(或在您的堆陣,只是最後)。
然後你必須重新建立堆條件,這就是所謂的「heapify」。這發生在兩個階段:
這意味着
10
/\
12 14
+ 1會
10
/\
12 14
/
1
而這違反了一堆條件,所以你必須heapify
10
/\
1 14
/
12
但這仍然不對,所以你必須再次heapify
1
/\
10 14
/
12
你瞧......一切就OK了,現在:-)
step1: 10
step2: 10
/
12
step3: 10
/\
12 14
step4: 1
/\
10 12
/
14
step5: 1
/\
6 10
/\
12 14
但14比12以上,這是怎麼下令? – user220755 2010-01-19 12:20:03
這並不違反堆條件......看看http://upload.wikimedia.org/wikipedia/commons/6/69/Min-heap.png 36大於19,7大於2等等 – Leo 2010-01-19 12:25:48
或者澄清一下:你的解決方案是正確的!我只是解釋瞭如何到達算法... – Leo 2010-01-19 12:32:27