如何解决在Python中删除二叉树节点为什么self!= parent.left或parent.right?
我有两个真正相似的程序,它们具有相同的用途(将一个节点作为类中的二叉树方法删除)。其中只有一个工作。如果您告诉我原因,我会很乐意。
功能程序,其结尾为:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。