簡體   English   中英

從二進制最大堆中刪除根節點的算法

[英]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 = 10parent = 5 ,它仍然運行if以查看child > parent 為什么不檢查這種情況,而是停止循環呢?

希望這是有道理的。 對不起,如果很明顯,我一整天都在看堆和節點,我的腦袋已不再合作了。

您必須檢查兩個子節點。 從二進制最大堆中刪除的規則是:

  1. 結果是堆頂部的節點(即根)。
  2. 將項目從堆的末尾移動到堆的頂部。
  3. 當您插入的項目小於其子項目中的最大項目時,請將其與最大的子項交換。

您的代碼未正確執行第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個元素,則可以停止,因為最后一個元素已從樹中刪除。

你從不把childparent比較,而是用tab[parent]比較tab[child] tab[parent]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM