[英]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.