如何解决在Python中迭代删除二进制搜索树中的值
我目前正在学习一门课程,我正在学习数据结构和算法,并且正在学习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
else:
#two child ondes
if currentNode.left is not None and currentNode.right is not None:
currentNode.value = currentNode.right.getMinValue() #get the left number from the right subtree
currentNode.right.remove(currentNode.value,currentNode) #remove that most left number by using remove()
#on the right currentNode
#root node
elif parentNode is None:
if currentNode.left is not None:
currentNode.value = currentNode.left.value
currentNode.right = currentNode.left.right
currentNode.left = currentNode.left.left
elif currentNode.right is not None:
currentNode.value = currentNode.right.value
currentNode.left = currentNode.right.left
currentNode.right = currentNode.right.right
#only 1 item left in BST
else:
pass
#one child node
elif parentNode.left == currentNode:
parentNode.left = currentNode.left if currentNode.left is not None else currentNode.right
elif parentNode.right == currentNode:
parentNode.right = currentNode.left if currentNode.left is not None else currentNode.right
break
return self
def getMinValue(self):
currentNode = self
while currentNode.left is not None:
currentNode = currentNode.left
return currentNode.value
-
while
循环将遍历每个节点并运行,直到没有更多节点为止 - 第一个
if
和elif
用于查找您要删除的节点。 -
else
适用于实际删除,它具有3个不同的选项:currentNode
有两个孩子,您只需将其替换为右节点的最左值,然后从中删除此最左值即可。正确的行为。另一种情况是parentNode
没有父节点,这就是根节点的情况。最后一种情况是,当您只有一个子节点时,只需将currentNode
的值更改为它的左节点或右节点(取决于它具有哪个节点)即可。
我不清楚的是条件背后的逻辑,以及当我们要删除root
节点时它如何工作。该代码是否还应该运行第一个条件,即两个孩子节点的第一个条件?我几乎可以确定这是不应该发生的,并且该条件仅应在其特殊情况下运行。我已经看过一遍又一遍的视频说明,但是我实在不明白。
解决方法
当我们要删除根节点时。该代码是否还应该运行第一个条件,即两个孩子节点的第一个条件?
即使必须删除根节点,它实际上也会评估第一个条件。如果根节点同时具有左子节点和右子节点,则“选项1”适用于该节点:第一个选项可以很好地处理具有两个子节点的任何节点,无论它是否是根节点。在此选项中,无需区分根节点还是非根节点。
其他两个选项仅用于不有两个子节点的节点。您似乎建议(也在代码注释中)建议只有选项3处理这种情况,而选项2也会处理这种情况。选项2用于节点节点 not 没有两个子节点 且它是根节点的情况。如果根有两个孩子,则将其视为选项1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。