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 回答