问题描述
我有两个真正相似的程序,它们具有相同的用途(将一个节点作为类中的二叉树方法删除)。其中只有一个工作。如果您告诉我原因,我会很乐意。
功能程序,其结尾为:
elif parent.left == self:
parent.left = self.left if self.left is not None else self.right
elif parent.right == self:
parent.right = self.left if self.left is not None else self.right
但是还有其他程序不起作用,并以以下结尾:
elif parent.left == self:
self = self.left if self.left is not None else self.right
elif parent.right == self:
self = self.left if self.left is not None else self.right
那为什么要自我!= parent.left或parent.right?
这是两个完整的方法:
#It works
def remove(self,value,parent=None):
if value < self.value:
if self.left is not None:
self.left.remove(value,self)
elif value > self.value:
if self.right is not None:
self.right.remove(value,self)
else:
if self.left is not None and self.right is not None:
self.value = self.right.getMinValue()
self.right.remove(self.value,self)
elif parent is None:
if self.left is not None:
self.value = self.left.value
self.right = self.left.right
self.left = self.left.left
elif self.right is not None:
self.value = self.right.value
self.left = self.right.left
self.right = self.right.right
else:
pass
elif parent.left == self:
parent.left = self.left if self.left is not None else self.right
elif parent.right == self:
parent.right = self.left if self.left is not None else self.right
#It does not
def remove(self,parent=None):
if value < self.value:
if self.left is not None:
self.left.remove(value,self)
elif value > self.value:
if self.right is not None:
self.right.remove(value,self)
else:
if self.left is not None and self.right is not None:
self.value = self.right.getMinValue()
self.right.remove(self.value,self)
elif parent is None:
if self.left is not None:
self.value = self.left.value
self.right = self.left.right
self.left = self.left.left
elif self.right is not None:
self.value = self.right.value
self.left = self.right.left
self.right = self.right.right
else:
pass
elif parent.left == self:
self = self.left if self.left is not None else self.right
elif parent.right == self:
self = self.left if self.left is not None else self.right
解决方法
第二个代码段失败的原因是它不会更改parent.left
或parent.right
所引用的内容。
remove()
方法只涉及更改树结构,因此您想更改parent.left
或parent.right
所指的内容。更改self
所指的内容不会更改树中的任何内容。
强制链接到Ned Batchelder