在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.leftparent.right所引用的内容。

remove()方法只涉及更改树结构,因此您想更改parent.leftparent.right所指的内容。更改self所指的内容不会更改树中的任何内容。

强制链接到Ned Batchelder

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...