从BST递归删除

时间:2019-03-22 17:09:25

标签: python recursion binary-search-tree

当我要删除的节点是根节点或叶节点时,我已经结束了,但是当我有兄弟姐妹或孩子时,我也必须能够删除,这对我来说很难。 / p>

SELECT array_agg(e order by id) 
   FROM unnest( array[1, 2, 3, 4, 7, 6] ) with ordinality as s1(e,id)
    WHERE not exists 
   (
     SELECT 1 FROM unnest(array[2, 3, 7]) as s2(e)
      where s2.e = s1.e
    )

我发布了整个代码,因此,如果有人愿意在自己的机器上进行测试,或者有人可以将其用于教育目的,则可以这样做。

1 个答案:

答案 0 :(得分:0)

将来尝试进行一些调试,并提供一些示例输出和预期输出。

请考虑以下

def _remove(self, key, node):
        if node == None:
            return None
        if key == node.key:
            if node.left and not node.right:  # only left
                return node.left
            elif node.right and not node.left: # only right
                return node.right
            elif not node.right and not node.left: # neither
                return None
            else : # both
                inorder_successor = node.right
                while inorder_successor.left:
                    inorder_successor = inorder_successor.left
                # remember to replace inorder_successor with it's right child
                ...
                ...
                return inorder_successor

        # iterates recursively in the bst
        elif key <= node.key:
            node.left = self._remove(key, node.left)
        else:
            node.right = self._remove(key, node.right)

        return node

关于变化的一些观察

  1. 您使用None检查is != None,这是一种非Python的方式。只需检查isis not即可
  2. 在具有两个子节点的BST中替换节点的正确方法是使用顺序后继者(已删除节点的右子节点的最左后代)