Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不删除布尔删除(对象o)方法中的最后一项_Java_Computer Science - Fatal编程技术网

Java 不删除布尔删除(对象o)方法中的最后一项

Java 不删除布尔删除(对象o)方法中的最后一项,java,computer-science,Java,Computer Science,除了最后一项之外,这几乎删除了所有应该删除的内容。 这是我提交时得到的反馈: 输入:[东西,单词,东西,两者,动物园,是] ----------预期大小:0 BST实际节点数:1 删除对象后的树无效 代码如下: @SuppressWarnings("unchecked") public boolean remove(Object o) { Node n = root; while (n != null) { int comp = n.val

除了最后一项之外,这几乎删除了所有应该删除的内容。 这是我提交时得到的反馈:

输入:[东西,单词,东西,两者,动物园,是]

----------预期大小:0 BST实际节点数:1

删除对象后的树无效

代码如下:

@SuppressWarnings("unchecked")
public boolean remove(Object o) {
        Node n = root;
        while (n != null) {
            int comp = n.value.compareTo(o);
            if (comp == 0) {
                size--;
                remove(n);
                return true;
            } else if (comp > 0) {
                n = n.left;
            } else {
                n = n.right;
            }
        }
        return false;
    }

    private void remove(Node root) {
        if (root.left == null && root.right == null) {
            if (root.parent == null) {
                root = null;
            } else {
                if (root.parent.left == root) {
                    root.parent.left = null;
                } else {
                    root.parent.right = null;
                }
            }
        } else if (root.left == null || root.right == null) {
            Node child = root.left; 
            if (root.left == null) {
                child = root.right;
            }
            if (root.parent == null) {   
                root = child;
            } else if (root.parent.left == root) {
                root.parent.left = child;
            } else {
                root.parent.right = child;
            }
            child.parent = root.parent;
        } else {                          
            Node successor = root.right;
            if (successor.left == null) {
                root.value = successor.value;
                root.right = successor.right;
                if (successor.right != null) {
                    successor.right.parent = root;
                }
            } else {
                while (successor.left != null) {
                    successor = successor.left;
                }
                root.value = successor.value;
                successor.parent.left = successor.right;
                if (successor.right != null) {
                    successor.right.parent = successor.parent;
                }
            }
        }
    }

删除二进制搜索树中的节点包括以下步骤:

  • 找到节点
  • 您需要确保有一个用于搜索的函数,以便找到要删除的节点

  • 处理节点的子树
  • 如果节点的子节点少于两个子节点,则子树可以进行简单的更改。如果存在子节点,则当前节点将替换为其子节点。否则,如果要删除的节点有两个子节点,则只需将要删除的节点替换为要删除的元素的左子树的最右侧节点或右子树的最左侧节点

  • 确保如果已将当前节点替换为其他节点,则其他节点将不会作为副本存在
  • 为了实现这一点,您需要以下方法: -搜寻 -查找子树的最左/最右节点 -除去


    你现在的代码太复杂了。我会用原子方法重写它。

    你的问题需要一个更好的标题,需要对你试图解决的问题进行更多的解释