python - 在 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
那么为什么 self != 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, 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:
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的强制性链接
推荐阅读
- c++ - srand() 与非常量参数一起使用时不起作用
- c# - WaitTimeSeconds 的 MassTransit 默认值
- typescript - Electron v14 TypeScript 类型定义中缺少 enableRemoteModule
- java - 从 mongodb 获取随机值
- json - JSON:键和字段名称:动态解析
- python-3.x - 数据框 - 根据给定列的先前和当前行值创建新列
- ruby-on-rails - OOP 如何转化为 Rails?
- ssh - 通过 ssh 远程启动前台程序/脚本
- prolog - Prolog中的谓词,谓词仅适用于数字
- javascript - 如何使用 document.getElementById 将 CSS 切换为“display:none”