Python二进制搜索树删除功能

时间:2018-08-12 03:59:58

标签: python

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

class BST:
    def __init__(self, root=None):
        self.root = root


    def remove(self, val):

        if self.root == None:
            return root
        else:
            self._remove(val, self.root)

    def _remove(self, val, node):
        if node == None:
            return node # Item not found

        if val < node.val:
            self._remove(val, node.left)
        elif val > node.val:
            self._remove(val, node.right)
        else: 
            # FOUND NODE TO REMOVE
            if node.left != None and node.right != None: # IF TWO CHILDREN
                node.val = self._find_min(node.right)
                node.right = self._remove(node.val, node.right)
            else: # ZERO OR ONE CHILD
                if node.left == None: # COVERS ZERO CHILD CASE 
                    node = node.right
                elif node.right == None:
                    node = node.left      

        return node

无法弄清楚为什么此功能不会删除某些值。我调试了print语句,可以看到如果尝试删除值,该函数将进入else块并成功删除具有两个子节点的节点。但是,当尝试删除一个有一个或零个子节点的节点时,代码将正确执行,但是当我打印树以查看其内容时,该节点仍然存在。

要删除的节点将至少有一个None子节点,并且将节点设置为其右(或左)子节点似乎很简单,我假设将节点设置为None。

我对Java有一定的经验,但是对Python来说还很陌生,有时我会遇到“自我”协议的麻烦,但是我认为情况并非如此。

0 个答案:

没有答案
相关问题