我目前正在學習數據結構和算法以及 BST 的課程。我已經讓代碼可以工作并理解其中的大部分內容,但我有一個關于刪除功能的問題。這就是我的代碼的樣子:class BST: def __init__(self, value): self.value = value self.left = None self.right = None def insert(self, value): currentNode = self while True: if value < currentNode.value: if currentNode.left is None: currentNode.left = BST(value) break else: currentNode = currentNode.left else: if currentNode.right is None: currentNode.right = BST(value) break else: currentNode = currentNode.right return self def contains(self, value): currentNode = self while currentNode is not None: if value < currentNode.value: currentNode = currentNode.left elif value > currentNode.value: currentNode = currentNode.right else: return True return False def remove(self, value, parentNode = None): currentNode = self while currentNode is not None: if value < currentNode.value: parentNode = currentNode currentNode = currentNode.left elif value > currentNode.value: parentNode = currentNode currentNode = currentNode.right #Found the node據我了解,對于刪除功能:循環while將迭代每個節點并運行,直到沒有更多的節點第一個if和elif用于查找您要刪除的節點。適用else于實際刪除,有 3 個不同的選項:要么currentNode有兩個子節點,要么將其替換為右側節點的最左側值,然后從右側節點中刪除該最左側值。另一種情況是parentNode沒有父節點,這將是根節點的情況。currentNode最后一種情況是,當您只有一個子節點時,您所要做的就是更改其左節點或右節點的值(取決于它有哪一個)。我不清楚的是條件背后的邏輯,以及當我們想要刪除節點時它是如何工作的root。代碼不是應該也運行第一個條件,即兩個子節點的條件嗎?我幾乎可以肯定這不應該發生,并且該條件應該只適用于其特殊情況。我看了一遍又一遍的視頻解釋,但我就是無法掌握其中的竅門。
1 回答

慕標琳琳
TA貢獻1830條經驗 獲得超9個贊
當我們想要刪除根節點時。代碼不是應該也運行第一個條件,即兩個子節點的條件嗎?
即使必須刪除根節點,它實際上也會評估第一個條件。如果根節點同時具有左子節點和右子節點,則“選項 1”適用于它:第一個選項可以很好地處理具有兩個子節點的任何節點,無論它是否是根節點。在此選項中不需要區分根節點或非根節點。
其他兩個選項僅適用于沒有兩個子節點的節點。您似乎建議(也在代碼注釋中)只有選項 3 可以處理這種情況,但選項 2 也可以。選項2適用于當節點node沒有兩個子節點并且它是根節點時。如果根有 2 個孩子,則將被視為選項 1。
添加回答
舉報
0/150
提交
取消