当前位置: 首页 > 知识库问答 >
问题:

无法删除二进制搜索树中的根节点

孔驰
2023-03-14

我正在尝试删除我的二叉查找树的根,以便我可以更新它的值,但这种方法不能做到这一点。我的想法是删除根,然后将其再次插入二叉查找树中,但使用另一个值。它适用于树中的每个节点,但不是我无法删除它的根本原因。有人知道为什么会发生这种情况吗?谢谢。

public V remove(K key) {
    Node node = remove(key, root);
    return node.value;
}

private Node remove(K key, Node current) {
    if (current == null) { 
        return null;
    }
    if (current.key.equals(key)) { 
        
        if (current.left == null && current.right == null) {
            return null;
        } 
        else if (current.left == null && current.right != null) {
            return current.right;
        } else if (current.left != null && current.right == null) {
            return current.left;
        } else {
            Node plowest = current.right;
            Node parent = current;
            while (plowest.left != null) {
                parent = plowest;
                plowest = plowest.left;
            }
            plowest.left = current.left;
            if (plowest != current.right) {
                parent.left = plowest.right;
                plowest.right = current.right;
            }
            return plowest;
        }
    }
    if (key.compareTo(current.key) < 0) { // Subarbre esquerra
        current.left = remove(key, current.left);                                   
    } else {// Subarbre dret
        current.right = remove(key, current.right);
    }
    return current;
}

这是我调用方法删除任何节点的主代码,在这种情况下,我想删除根。

public static void main(String[] args) {

    BSTMapping<String, Integer> arbre = new BSTMapping();
    arbre.put("G", 4);
    arbre.put("A", 1);
    arbre.put("C", 2);

    arbre.remove("G");

    Iterator it = arbre.iterator();
    while (it.hasNext()) {
        BSTMapping.Pair p = (BSTMapping.Pair) it.next();
        System.out.println(p.getKey() + " - " + p.getValue());
    }

     
}

共有1个答案

欧阳晗日
2023-03-14

删除根目录时,remove(K键,当前节点)永远不会到达将节点分配给当前节点的底部。左或当前。右。您可以在适当的情况下,通过直接分配给根变量,在删除(键)中解决此问题。

public V remove(K key) {
    Node node = remove(key, root);
    if (root.key.equals(key)) {
       root=node;
    }
    return node.value;
}
 类似资料:
  • 目前,我在理解如何在没有传递节点时从二进制搜索树中删除节点时遇到了一个问题。我有两个类,BSTSet和BSTNode,每个类都有一个remove方法。。 当我被传递一个节点时,我理解删除方法,但当我在根上调用remove方法并试图从node类中删除节点时,我不知道从何处开始。有人能告诉我吗?谢谢如果您想了解更多信息,请询问。

  • 我目前正在做一个学校项目,我必须为二叉搜索树编写一些辅助函数。其中一个函数从树中删除了一个节点。我正在尝试运行一些测试用例,但似乎无法让它们正常工作。我知道这个问题与我如何使用指针有关,但我不太确定我哪里出错了。 这是代码: 注意:我没有包括leftRoot()函数,但它相当简单,我知道它做了它应该做的事情(返回子树中最左边的根)下面是我的教授给我们的测试remove函数的代码部分: 如果有必要,

  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码

  • 我在C中实现了一个二进制搜索树。 对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为NULL,但是当我试图输出这些值时,我得到了一个状态访问冲突。 下面是有关删除的代码。我希望删除父节点,并设置树- 主要:

  • 我正在一个实验室工作,该实验室要求我为二进制搜索树创建一个删除方法。这是我的remove方法的代码。 运行代码时得到的输出是: 移除90后的树。70 80 85 98 100 120 移除70. 80 85 98 100 120后的树 移除85后的树。80 98 100 120 移除98后的树。80 100 120 移除80后的树。100 120 移除120后的树。100 移除100后的树。100

  • 我正在尝试从二叉查找树中删除节点。我可以成功地删除树上的任何其他节点,除了一个特殊的情况。如果目标节点有两个子节点,左边的子节点有右边的子树,我可以定位正确的替换节点,并将值切换到目标节点,但替换节点永远不会被删除。 看看上面的图片,如果我尝试删除17,程序将正确地导航到13,并用13替换17,但它不会像预期的那样删除原来的13。 我附加了我的remove方法和其中引用的方法。 这是我的Node类