JAVA:修剪决策树

时间:2014-04-09 03:06:14

标签: java binary-tree decision-tree pruning

我正在编写一个应该修剪决策树的函数。该函数应该删除树中的"实例数组长度"小于给定的输入长度(此决策树包含保存值数组的节点)。我的问题(我认为)是将节点引用传递给此方法然后将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

1 个答案:

答案 0 :(得分:0)

您的'crt'参数是对原始对象的引用。因此,您基本上无效该引用。

我认为您需要在保持对象(不在递归函数中)的上下文中使其无效。更具体地说,在方法'pruneRecursively'而不是调用:

removeSubNodes(crt);

我会打电话给:

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

希望它有所帮助, 最好的问候!