亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Python中迭代刪除二叉搜索樹中的值

在Python中迭代刪除二叉搜索樹中的值

陪伴而非守候 2023-09-19 14:30:14
我目前正在學習數據結構和算法以及 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。


查看完整回答
反對 回復 2023-09-19
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號