【问题标题】:Remove method in BST with 2 children, won't remove it predecessor删除带有 2 个孩子的 BST 中的方法,不会删除它的前任
【发布时间】:2018-12-13 00:53:40
【问题描述】:

我正在尝试为 BST 编写删除方法。如果有 0 个或 1 个孩子,它就可以工作。但是,如果有 2 个子节点,则该方法将数据从前任(最右边的孩子)复制到要删除的节点,然后应该删除前任。出于某种原因,前任仍在树中并且没有被正确删除。我确定这是一个简单的递归错误,但我就是想不通!我将非常感谢任何帮助、反馈和 cmets。谢谢。

    public boolean myRemove(Object o) {
    if (isEmpty()) {
        return false;
    }
    E data = (E)o;
    root = myRemoveHelper(root, data);
    size--;
    return true;
}
private Node<E> myRemoveHelper(Node<E> root, E data) {
    if (root.data == data) {
        return myRemoveIt(root);
    }
    else if (data.compareTo(root.data) < 0) {
        root.left = myRemoveHelper(root.left, data);
    }
    else {
        root.right = myRemoveHelper(root.right, data);
    }
    return root;
}
private Node<E> myRemoveIt(Node<E> nodeToRemove) {
    if (nodeToRemove.left == null && nodeToRemove.right == null) {
        return null;
    }
    else if (nodeToRemove.left == null && nodeToRemove.right != null) {
        return nodeToRemove.right;
    }
    else if (nodeToRemove.left != null && nodeToRemove.right == null) {
        return nodeToRemove.left;
    }
    else {
        Node<E> temp = nodeToRemove.right;
        while (temp.left != null) {
            temp = temp.left;
        }
        nodeToRemove.data = temp.data;

        //does not remove the duplicate! :(
        nodeToRemove.left = myRemoveHelper(temp, temp.data);
        return nodeToRemove;
    }
}

【问题讨论】:

    标签: recursion tree binary-tree binary-search-tree binary-search


    【解决方案1】:

    在你说你在myRemoveIt中取the rightmost left child的问题中但是你去leftmost right child中:

    Node<E> temp = nodeToRemove.right;
    while (temp.left != null) {
        temp = temp.left;
    }
    

    但是在你分配到左边之后:nodeToRemove.left = myRemoveHelper(temp, temp.data);

    您需要将其更改为:

    nodeToRemove.right = myRemoveHelper(nodeToRemove.right, temp.data);
    

    现在您确定temp.data 位于叶子上(或者至少我们知道他缺少左侧)并且您发送到myRemoveHelper 的新根是右侧的根,因为新数据已经设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多