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