【问题标题】:JAVA: Pruning a Decision TreeJAVA:修剪决策树
【发布时间】:2014-05-22 00:48:45
【问题描述】:

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

【问题讨论】:

    标签: java binary-tree decision-tree pruning


    【解决方案1】:

    您的“crt”参数是对原始对象的引用。因此,您基本上是在取消该引用。

    我认为您需要在持有对象的上下文中(而不是在递归函数中)取消它。更具体地说,在方法“pruneRecursively”中而不是调用:

    removeSubNodes(crt);
    

    我会这样称呼:

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

    希望对你有帮助, 最好的问候!

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2019-06-14
      • 2011-04-28
      • 2011-05-02
      • 1970-01-01
      • 2015-09-22
      • 2021-10-01
      • 2015-03-20
      相关资源
      最近更新 更多