我目前正在學習數(shù)據(jù)結構和算法以及 BST 的課程。我已經(jīng)讓代碼可以工作并理解其中的大部分內容,但我有一個關于刪除功能的問題。這就是我的代碼的樣子: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據(jù)我了解,對于刪除功能:循環(huán)while將迭代每個節(jié)點并運行,直到?jīng)]有更多的節(jié)點第一個if和elif用于查找您要刪除的節(jié)點。適用else于實際刪除,有 3 個不同的選項:要么currentNode有兩個子節(jié)點,要么將其替換為右側節(jié)點的最左側值,然后從右側節(jié)點中刪除該最左側值。另一種情況是parentNode沒有父節(jié)點,這將是根節(jié)點的情況。currentNode最后一種情況是,當您只有一個子節(jié)點時,您所要做的就是更改其左節(jié)點或右節(jié)點的值(取決于它有哪一個)。我不清楚的是條件背后的邏輯,以及當我們想要刪除節(jié)點時它是如何工作的root。代碼不是應該也運行第一個條件,即兩個子節(jié)點的條件嗎?我?guī)缀蹩梢钥隙ㄟ@不應該發(fā)生,并且該條件應該只適用于其特殊情況。我看了一遍又一遍的視頻解釋,但我就是無法掌握其中的竅門。
1 回答

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