[英]Algorithm to delete root node from binary max heap
我坐在這里查看用於刪除二進制最大堆中的根節點的算法,然后使用新的根更新樹。 以下是它的外觀:
if (n==0) {
empty = true;
} else {
empty = false;
top = a[1];
a[1] = a[n];
n = n-1;
parent = 1;
child = 2;
while (child<=n-1) {
if (tab[child]<tab[child+1]){
child = child+1;
}
if (tab[child]>tab[parent]) {
swap[tab[child],tab[parent]);
parent=child;
child=parent*2;
} else {
child=n;
}
}
}
所以,我不明白為什么它說:
while(child<=n-1)
我的意思是,假設我們有一個包含11個節點的堆,包括根節點。 當我們刪除根節點時,我們剩下10個節點。 根據此代碼,如果child = 10
,循環應該停止。 但這有什么意義呢? 即使child = 10
且parent = 5
,它仍然運行if以查看child > parent
? 為什么不檢查這種情況,而是停止循環呢?
希望這是有道理的。 對不起,如果很明顯,我一整天都在看堆和節點,我的腦袋已不再合作了。
您必須檢查兩個子節點。 從二進制最大堆中刪除的規則是:
您的代碼未正確執行第3步。 首先要確定哪個是最大的孩子。
我懷疑代碼正在使用(child <= n-1)
因為它假定您將檢查child
項和child+1
處的項目以滿足步驟3的要求。
我認為(child <= n-1)
是一個錯誤。 它應該是:
while (child <= n)
{
if (child < n && tab[child] < tab[child+1])
{
child = child+1;
}
否則,如你所說,有可能無法進行比較。
不要忘記, child
只是存儲二進制堆的數組的索引。 這意味着如果您到達第n
個元素,則可以停止,因為最后一個元素已從樹中刪除。
你從不把child
和parent
比較,而是用tab[parent]
比較tab[child]
tab[parent]
!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.