我正在编写一个应该修剪决策树的函数。该函数应该删除树中的"实例数组长度"小于给定的输入长度(此决策树包含保存值数组的节点)。我的问题(我认为)是将节点引用传递给此方法然后将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
答案 0 :(得分:0)
您的'crt'参数是对原始对象的引用。因此,您基本上无效该引用。
我认为您需要在保持对象(不在递归函数中)的上下文中使其无效。更具体地说,在方法'pruneRecursively'而不是调用:
removeSubNodes(crt);
我会打电话给:
crt.left = null;
crt.right = null;
希望它有所帮助, 最好的问候!