0

決定木を剪定する関数を書いています。この関数は、「インスタンス配列の長さ」が指定された入力長よりも小さいツリー内のノードを削除する必要があります (このディシジョン ツリーには、値の配列を保持するノードが保持されます)。私の問題 (私が思うに) は、このメソッドにノード参照を渡してから、関数内の任意のノードに null を割り当てても、これらのノードがグローバルに削除されないことです。ローカル参照を削除するだけです。ここに私が書いたコードがあります:

private void pruneRecursively(DTNode crt, int l){
    if(crt.a.length < l){
        removeSubNodes(crt);
    }

    else{
        if(crt.left != null) //if current node has a left child
            pruneRecursively(crt.left, l);
        if(crt.right != null) //if current node has a right child
            pruneRecursively(crt.right, l);
    }
}


private void removeSubNodes(DTNode crt)
    if(crt.left != null)
        removeSubNodes(crt.left);
    if(crt.right != null)
        removeSubNodes(crt.right);

    //crt.a = null;
    crt = null;

インスタンス配列の長さが入力の長さ l より小さいノードがツリーから完全に削除されるように、このコードを別の方法で記述するにはどうすればよいですか?

編集 これはノードクラスのヘッダーです。関連情報のようです:

public class DTNode {
    Instance[] a; //array of instance variables
    double testValue; //determines where to split data
    DTNode left, right; //each node links to two child nodes
4

1 に答える 1

0

「crt」パラメーターは元のオブジェクトへの参照です。したがって、本質的にその参照を無効にしています。

オブジェクトを保持しているというコンテキストで(再帰関数内ではなく)無効にする必要があると思います。より具体的には、呼び出す代わりにメソッド「pruneRecursively」で:

removeSubNodes(crt);

私はちょうど次のようなものを呼び出すだろう:

crt.left = null;
crt.right = null;

よろしくお願いします!

于 2015-03-21T21:17:13.040 に答える