下面的代码表示一个二进制树,其主要功能是其测试程序。
问题出在代码下方,并引用了删除函数,如果其中的注释是其中的实际部分,则该函数将起作用。
public class BTT {
btnode root;
private class btnode {
Object data;
btnode left, right;
btnode(Object data) {
this.data = data;
}
btnode(Object data, btnode left, btnode right) {
this.data = data;
this.left = left;
this.right = right;
}
public String toString() {
return "" + data;
}
}
BTT() {
root = null;
}
void add(Object data) {
root = add(data, root);
}
btnode add(Object data, btnode N) {
if(N == null) {
return new btnode(data);
}
//=========================
if((int) data > (int) N.data) {
N.right = add(data, N.right);
} else {
N.left = add(data, N.left);
}
//=========================
return N;
}
void printInorder() {
printInorder(root);
System.out.println();
}
private void printInorder(btnode N) {
if(N == null) {
return;
}
printInorder(N.left);
System.out.print(N.data + ", ");
printInorder(N.right);
}
void remove(Object data) {
/*root = */
remove(data, root);
}
/*btnode instead of void*/void remove(Object data, btnode N) {
if(N == null) {
return /*null*/;
}
if((int) data > (int) N.data)
/*N.right = */ {
remove(data, N.right);
} else if((int) data < (int) N.data)
/*N.right = */ {
remove(data, N.right);
} else {//Object found
if(N.left == null && N.right == null) {
N = null;
} else if(N.left != null && N.right == null) {
N = N.left;
} else if(N.left == null && N.right != null) {
N = N.right;
}
//else//(irrelevant)
}
/*return N*/
}
public static void main(String[] args) {
BTT BT1 = new BTT();
BT1.add(1);
BT1.add(3);
BT1.add(2);
BT1.add(4);
BT1.printInorder();
BT1.remove(1);
BT1.printInorder();
}
}
我理解BTT的remove
函数不起作用的原因是当更改引用N
(s)s的btnode
变量时,它只会改变指针N
本身,而不是它指向的地址的内容。
有没有办法让删除功能而不添加btnode
返回的值而不是void
?或者将它改为:btnode remove(Object data, btnode N){...}
唯一的方式?