【问题标题】:Why do I need to recursively return nodes when deleting from a binary search tree?为什么从二叉搜索树中删除时需要递归返回节点?
【发布时间】:2018-08-18 22:04:58
【问题描述】:

我正在尝试实现二叉搜索树的删除功能。逻辑对我来说很有意义,但我无法理解为什么我的代码似乎不起作用。我发现的不同之处在于,从下往上递归地返回更改似乎有效,但在找到节点时简单地删除节点却没有。任何人都可以帮助阐明这一点吗?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    为了简单起见,下面的代码有一个类似的场景

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

    这里arr 保持不变,名称root 被简单地分配了不同的值。这就是为什么在第二个实现中你只重新分配根的类成员的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多