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; } 返回焦点; }
我已经编写了上面的代码来删除二进制搜索树中的一个节点。然而,由于某种原因,当我运行preordertraversal函数打印所有节点时,我看到该节点没有被删除。有人能告诉我为什么一个节点没有被删除吗。这个函数似乎是正确的。我猜到了!问题是我没有以正确的方式穿过这棵树。而且我在生两个孩子的情况下犯了一个错误。我没有设定正确的焦点,对孩子。这是更新后的代码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
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;
}