簡體   English   中英

二叉搜索樹刪除方法刪除整個子樹

[英]Binary Search Tree Delete method Deletes Whole Subtree

我一直在學習數據結構,並一直在嘗試在我的 BST class 中實現刪除方法。 我注意到的是,它不會刪除一個節點,而是刪除該節點所屬的整個子樹。

    class BST:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def addchild(self, child):
        if child == self.data:
            return
        if child < self.data:
            if self.left:
                self.left.addchild(child)
            else:
                self.left = BST(child)
        else:
            if self.right:
                self.right.addchild(child)
            else:
                self.right = BST(child)

    def search(self, data):
        if self.data == data:
            return True
        if data < self.data:
            if self.left:
                return self.left.search(data)
            else:
                return False
        else:
            if self.right:
                return self.right.search(data)
            else:
                return False

    def iot(self):
        vals = []

        if self.left:
            vals += self.left.iot()

        vals.append(self.data)

        if self.right:
            vals += self.right.iot()

        return vals

    def findmax(self):
        if self.right:
            return self.right.findmax()
        else:
            return self.data

    def findmin(self):
        if self.left:
            return self.left.findmin()
        else:
            return self.data

    def delete(self, data):
        if data < self.data:
            if self.left:
                self.left = self.left.delete(data)
        elif data > self.data:
            if self.right:
                self.right = self.right.delete(data)
        else:
            if self.left is None and self.right is None:
                return None
            elif self.left is None:
                return self.right
            elif self.right is None:
                return self.left

            minval = self.right.findmin()
            self.data = minval
            self.right = self.right.delete(minval)


def buildtree(arr):
    r = BST(arr[0])

    for i in range(1, len(arr)):
        r.addchild(arr[i])
    return r

因此,當輸入這些值並從樹中刪除數字 1 時,它將打印此

bst = buildtree([34, 7, 8, 1, 3, 4, 5, 10, 65, 98, 100, 203])

print(bst.iot())

bst.delete(1)

print(bst.iot())

1st print statement output: [1, 3, 4, 5, 7, 8, 10, 34, 65, 98, 100, 203]
2nd print statement output: [34, 65, 98, 100, 203]

當我在 Pycharm 中調試時,在離開刪除方法之前和執行所有步驟之后,樹將顯示左子樹完好無損,一切都應該是這樣。 但是,一旦我離開該方法,左子樹就會變為無。

任何幫助,將不勝感激。

這是一個強烈的提示:

您在代碼的最后一塊缺少 return 語句:

        minval = self.right.findmin()
        self.data = minval
        self.right = self.right.delete(minval)

調試答案:在您的示例中,1 將成為樹中最左邊的葉子。 所以看看發生了什么:當你開始刪除方法時,你說

if data < self.data:
        if self.left:
            self.left = self.left.delete(data)

所以基本上根的左兒子將持有過程結束時出現的任何東西。 如果你會沿着左分支直到你得到 1,你會看到你得到的情況是

else:
        if self.left is None and self.right is None:
            return None

這意味着根左子是無,這解釋了你的錯誤

暫無
暫無

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

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