从二进制搜索树中删除时,为什么需要递归返回节点?

时间:2018-08-18 22:04:58

标签: python data-structures tree binary-search-tree

我正在尝试实现二进制搜索树的删除功能。逻辑对我来说很有意义,但是我很难理解为什么我的代码似乎不起作用。我发现的区别是,从下到上递归地返回更改似乎可行,但是仅在找到节点时删除该节点无效。有人可以帮助阐明这一点吗?

我的代码(以及对我来说最有意义的代码)

def _delete(self, root, value):
    if root is None: 
    return

    if value < root.data:
        self._delete(root.left, value)         
    elif value > root.data:
        self._delete(root.right, value)     
    else:          
        if root.left is not None and root.right is not None: 
            root.data = self._find_min_value(root.right)    
            self._delete(root.right, root.data) 
        elif root.left is not None:         
            root = root.left
        else:                             
            root = root.right

我找到的解决方案

def _delete(self, root, value):
    if root is None: 
        return

    if value < root.data:
        root.left = self._delete(root.left, value)        
    elif value > root.data:
        root.right = self._delete(root.right, value)    
    else:          
        if root.left is not None and root.right is not None: 
            root.data = self._find_min_value(root.right)    
            root.right = self._delete(root.right, root.data)  
        elif root.left is not None:         
            return root.left
        else:                           
            return root.right
    return root

1 个答案:

答案 0 :(得分:2)

这是由于Python中分配的工作方式。罪魁祸首是行root = root.leftroot = root.right。您要执行的操作是更改根指向另一个值的内存位置。 Python所做的只是将名称root分配给另一个值,因此root指向的内存中原始位置保持不变。

为简化起见,您的情况类似于以下代码

arr = [1,2]
root = arr[1]
root = arr[2]

此处arr保持不变,名称根仅分配了不同的值。这就是为什么在第二个可行的实现中,您只能重新分配root的类成员。