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

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

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楼 票数:2

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

为了使其更简单,您具有与以下代码类似的方案

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

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

  ask by ayylamow translate from so

未解决问题?本站智能推荐:

2回复

PYTHON二进制搜索树-递归删除

我正在研究二叉搜索树类,我们必须使用递归来实现remove方法。 这是给我们的代码。 显然,对于每个条件返回的不仅仅是p。 而且我很确定第一个if和两个elif用于“定位”包含x的节点。 但是,我不确定如何执行这四种情况。 任何输入将不胜感激。 此外,最终目标是使用此方法来遍历B
1回复

存储在一维数组中的树的Python代码包含与右节点指针相关的逻辑错误

在我正在使用的 CS 教科书中的以下代码中,在插入值32后树的输出中,数组位置0节点的RightPointer设置为3 。 这对我来说没有意义,因为我认为它仍然应该是2 。 我看起来代码不正确,因为现在有两个节点的RightPointer为3 。 任何人都可以请解释我需要做什么才能使代码正常工作吗?
3回复

为什么我们需要二进制搜索树中的父节点-C#

我才刚刚开始学习数据结构,所以请忍受我的愚蠢,我正在尝试开发自己的BST版本,我不明白为什么需要父Node? 这项工作不应该很好吗。 我肯定缺少某些东西,我无法理解或了解它的含义,当current为null时,我们已经在需要插入节点的位置,为什么需要父节点。
5回复

在二进制搜索树中删除?

我正在阅读《 数据结构和算法:带示例的带注释的参考 》一书中使用的二叉树删除节点算法 在第34页的情况4(具有左右子树的删除节点)中,按照书中所述方法执行以下算法似乎无效,可能有人可能会帮助我我所缺少的东西,我可能是错的。 下一行如何从子树FindParent(largestValue)
2回复

如何反转(镜像)递归二进制搜索树的子树

我正在尝试用Java编写二进制搜索树。 我的BST使用许多“关键字”,并使用大多数递归方法将它们插入树中。 不幸的是,它似乎向后添加了它们,例如,右侧的字母(ac ...)比左侧的(xz ...)高。 我无法弄清楚如何正确逆转逻辑。 这是我的插入代码: 强文本 这是树的图形
1回复

Python:二进制搜索树和递归返回嵌套列表

给定二叉搜索树,例如: 我想得到一个值在a和b(含)之间的节点的有序列表。 我已经实现了一个递归辅助函数: 这给了我: 但是,我需要: 反正有什么要整理清单的? 我意识到我在做什么是将一个列表追加到另一个列表,但是不确定如何在不破坏代码的情况下解决此问题。
1回复

将所有节点指针存储在二进制搜索树的指针数组中

最近,我试图操纵二进制搜索树并被卡在这里。 我想要一个数组(指针数组),在其中要按顺序存储二进制搜索树每个节点的指针。 我不需要每个节点的值我需要指针,以便可以访问它们的值,左子树和右子树。 我所做的是 请帮忙。 谢谢。
4回复

在AVL树的二进制搜索树

据我所知, AVL树和二进制搜索树之间的时间复杂度在平均情况下是相同的,在最坏的情况下AVL击败BST。 这给了我一个提示,即AVL总是优于BST以各种可能的方式与它们进行交互,在平衡实现方面可能会增加一些复杂性。 是否有任何理由首先应该使用BST而不是AVL?