通过引用将对象更改为null / other对象

时间:2014-05-06 00:30:12

标签: java

下面的代码表示一个二进制树,其主要功能是其测试程序。

问题出在代码下方,并引用了删除函数,如果其中的注释是其中的实际部分,则该函数将起作用。

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){...}唯一的方式?

0 个答案:

没有答案
相关问题