我目前正在学习数据结构和算法以及 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
据我了解,对于删除功能:
循环while
将迭代每个节点并运行,直到没有更多的节点
第一个if
和elif
用于查找您要删除的节点。
适用else
于实际删除,有 3 个不同的选项:要么currentNode
有两个子节点,要么将其替换为右侧节点的最左侧值,然后从右侧节点中删除该最左侧值。另一种情况是parentNode
没有父节点,这将是根节点的情况。currentNode
最后一种情况是,当您只有一个子节点时,您所要做的就是更改其左节点或右节点的值(取决于它有哪一个)。
我不清楚的是条件背后的逻辑,以及当我们想要删除节点时它是如何工作的root
。代码不是应该也运行第一个条件,即两个子节点的条件吗?我几乎可以肯定这不应该发生,并且该条件应该只适用于其特殊情况。我看了一遍又一遍的视频解释,但我就是无法掌握其中的窍门。
慕标琳琳
相关分类