簡體   English   中英

Splay樹刪除

[英]Splay Tree Deletion

我無法概念化從 splay 樹中刪除的過程。 給定這個初始樹,我想刪除節點 78。

展開樹初始

根據我的課程中的信息(來自 Goodrich、Tamassia 和 Goldwasser),BST 中刪除的節點應該替換為通過執行從應該是 91 的節點開始的順序遍歷到達的下一個節點。然后這個節點應該展開到樹的頂端。 但是,此處的可視化工具顯示的情況並非如此。 https://www.cs.usfca.edu/~galles/visualization/SplayTree.html

在此處輸入圖像描述

可視化器將 78 替換為其前任 (70) 並展開該節點。 (有序后繼,即排序后的下一個鍵是 83,而不是 91。)一般來說,張開的樹具有極好的延展性,只要您將剛剛下降的路徑的長度大約減半,同時使其他路徑在大多數時間長一點,從漸近性能的角度來看,您是正確的(但是,您的教授可能有不同的想法)。

你的教科書描述:

BST 中刪除的節點應該被從應該是 91 的節點執行順序遍歷到達的下一個節點替換

該描述適用於非平衡 BST(二叉搜索樹),但不適用於大多數各種平衡二叉樹,也不適用於 Splay 樹。 要刪除 splay 樹中的節點,請執行以下操作:

  1. 將要刪除的節點展開到根節點並銷毀。 這留下了兩棵樹,稱為左樹 A 和右樹 B。
  2. 重組樹的新根將來自 A。將 A 樹的最大(最右邊)節點展開到它的根。
  3. 因為 A 的新根擁有 A 中最大的鍵,所以它沒有右孩子。 將 A 的新根的右孩子設置為 B。
  4. A是新的組合樹。

這就是https://www.cs.usfca.edu/%7Egalles/visualization/SplayTree.html上的可視化所做的。

您在對另一個答案的評論中說:

所以在實踐中,您選擇的節點來替換已刪除的節點並不重要,即影響性能等。

在典型的 splay 樹刪除算法中,要替換的節點將是前驅節點或后繼節點,按密鑰順序排列。

經驗法則是在訪問特定節點時始終張開。 找到要刪除的節點,然后展開到根節點。 找到它的前身,然后展開它到根。 還有一些變化,您也可以不那么激進地張開。

暫無
暫無

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

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