Java 二叉树删除节点函数不工作 public void removeNode(int数据){ deleteNode(根,数据); } 公共节点deleteNode(节点焦点,int数据){ if(焦点==null){ System.out.println(“树空”); 返回null; } else if(数据焦点数据){ deleteNode(focus.rightchild,数据); } 否则{ //没有孩子 if(focus.leftchild==null&&focus.rightchild==null){ 焦点=空; } //独生子女 else if(focus.leftchild==null){ focus=focus.rightchild; System.out.println(“此处”); } else if(focus.rightchild==null){ focus=focus.leftchild; } //2个孩子 否则{ 节点温度=findMin(focus.rightchild); focus.data=临时数据; deleteNode(focus.rightchild、temp.data); } } 返回焦点; } 公共节点findMin(节点焦点){ while(focus.leftchild!=null){ focus=focus.leftchild; } 返回焦点; }

Java 二叉树删除节点函数不工作 public void removeNode(int数据){ deleteNode(根,数据); } 公共节点deleteNode(节点焦点,int数据){ if(焦点==null){ System.out.println(“树空”); 返回null; } else if(数据焦点数据){ deleteNode(focus.rightchild,数据); } 否则{ //没有孩子 if(focus.leftchild==null&&focus.rightchild==null){ 焦点=空; } //独生子女 else if(focus.leftchild==null){ focus=focus.rightchild; System.out.println(“此处”); } else if(focus.rightchild==null){ focus=focus.leftchild; } //2个孩子 否则{ 节点温度=findMin(focus.rightchild); focus.data=临时数据; deleteNode(focus.rightchild、temp.data); } } 返回焦点; } 公共节点findMin(节点焦点){ while(focus.leftchild!=null){ focus=focus.leftchild; } 返回焦点; },java,algorithm,data-structures,Java,Algorithm,Data Structures,我已经编写了上面的代码来删除二进制搜索树中的一个节点。然而,由于某种原因,当我运行preordertraversal函数打印所有节点时,我看到该节点没有被删除。有人能告诉我为什么一个节点没有被删除吗。这个函数似乎是正确的。我猜到了!问题是我没有以正确的方式穿过这棵树。而且我在生两个孩子的情况下犯了一个错误。我没有设定正确的焦点,对孩子。这是更新后的代码 public void removeNode(int data) { deleteNode(root, data); } public

我已经编写了上面的代码来删除二进制搜索树中的一个节点。然而,由于某种原因,当我运行preordertraversal函数打印所有节点时,我看到该节点没有被删除。有人能告诉我为什么一个节点没有被删除吗。这个函数似乎是正确的。

我猜到了!问题是我没有以正确的方式穿过这棵树。而且我在生两个孩子的情况下犯了一个错误。我没有设定正确的焦点,对孩子。这是更新后的代码

public void removeNode(int data) {
    deleteNode(root, data);
}

public Node deleteNode(Node focus, int data) {
    if(focus == null) {
        System.out.println("Tree empty");
        return null;
    }
    else if(data < focus.data) {
        deleteNode(focus.leftchild, data);
    }
    else if(data > focus.data) {
        deleteNode(focus.rightchild, data);
    }
    else {
        // No child
        if(focus.leftchild == null && focus.rightchild == null) {
            focus = null;
        }
        // one child
        else if(focus.leftchild == null) {
            focus = focus.rightchild;
            System.out.println("here");
        }
        else if(focus.rightchild == null) {
            focus = focus.leftchild;
        }
        // 2 children
        else {
            Node temp = findMin(focus.rightchild);
            focus.data = temp.data;
            deleteNode(focus.rightchild, temp.data);
        }
    }
    return focus;
}

public Node findMin(Node focus) {
    while(focus.leftchild != null) {
        focus = focus.leftchild;
    }
    return focus;
}
公共节点deleteNode(节点焦点,int数据){
if(焦点==null){
System.out.println(“树空”);
返回null;
}
else if(数据<焦点数据){
focus.leftchild=deleteNode(focus.leftchild,数据);
}
else if(数据>焦点数据){
focus.rightchild=deleteNode(focus.rightchild,数据);
}
否则{
//没有孩子
if(focus.leftchild==null&&focus.rightchild==null){
焦点=空;
}
//独生子女
else if(focus.leftchild==null){
focus=focus.rightchild;
System.out.println(“此处”);
}
else if(focus.rightchild==null){
focus=focus.leftchild;
}
//2个孩子
否则{
节点温度=findMin(focus.rightchild);
focus.data=临时数据;
focus.rightchild=deleteNode(focus.rightchild,临时数据);
}
}
返回焦点;
}

设置
focus=null
focus=focus.rightchild
不会删除节点
focus
。您只需让变量
focus
(仅存在于该函数中)指向另一个节点(或
null
)。相反,您必须将节点父节点中的变量设置为不同的值!好吧我会试试的。非常感谢。
public Node deleteNode(Node focus, int data) {
    if(focus == null) {
        System.out.println("Tree empty");
        return null;
    }
    else if(data < focus.data) {
        focus.leftchild = deleteNode(focus.leftchild, data);
    }
    else if(data > focus.data) {
        focus.rightchild = deleteNode(focus.rightchild, data);
    }
    else {
        // No child
        if(focus.leftchild == null && focus.rightchild == null) {
            focus = null;
        }
        // one child
        else if(focus.leftchild == null) {
            focus = focus.rightchild;
            System.out.println("here");
        }
        else if(focus.rightchild == null) {
            focus = focus.leftchild;
        }
        // 2 children
        else {
            Node temp = findMin(focus.rightchild);
            focus.data = temp.data;
            focus.rightchild = deleteNode(focus.rightchild, temp.data);
        }
    }
    return focus;
}