我正在尝试实现二进制搜索树的删除功能。逻辑对我来说很有意义,但是我很难理解为什么我的代码似乎不起作用。我发现的区别是,从下到上递归地返回更改似乎可行,但是仅在找到节点时删除该节点无效。有人可以帮助阐明这一点吗?
我的代码(以及对我来说最有意义的代码)
def _delete(self, root, value):
if root is None:
return
if value < root.data:
self._delete(root.left, value)
elif value > root.data:
self._delete(root.right, value)
else:
if root.left is not None and root.right is not None:
root.data = self._find_min_value(root.right)
self._delete(root.right, root.data)
elif root.left is not None:
root = root.left
else:
root = root.right
我找到的解决方案
def _delete(self, root, value):
if root is None:
return
if value < root.data:
root.left = self._delete(root.left, value)
elif value > root.data:
root.right = self._delete(root.right, value)
else:
if root.left is not None and root.right is not None:
root.data = self._find_min_value(root.right)
root.right = self._delete(root.right, root.data)
elif root.left is not None:
return root.left
else:
return root.right
return root
答案 0 :(得分:2)
这是由于Python中分配的工作方式。罪魁祸首是行root = root.left
和root = root.right
。您要执行的操作是更改根指向另一个值的内存位置。 Python所做的只是将名称root分配给另一个值,因此root指向的内存中原始位置保持不变。
为简化起见,您的情况类似于以下代码
arr = [1,2]
root = arr[1]
root = arr[2]
此处arr
保持不变,名称根仅分配了不同的值。这就是为什么在第二个可行的实现中,您只能重新分配root的类成员。