JAVA: обрезка дерева решений
Я пишу функцию, которая должна обрезать дерево решений. Функция должна удалить все узлы в дереве, чья "длина массива экземпляров" меньше заданной длины ввода (это дерево решений содержит узлы, которые содержат массив значений). Моя проблема (я думаю) состоит в том, что передача ссылок на узлы этому методу и последующее присвоение нуля любым узлам в функции не удаляет эти узлы глобально. Это просто удаляет локальную ссылку. Вот код, который я написал:
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 ответ
Ваш параметр crt является ссылкой на исходный объект. Таким образом, вы по существу аннулируете эту ссылку.
Я думаю, что вам нужно обнулить его в контексте удержания объекта (не в рамках рекурсивной функции). Более конкретно в методе pruneRecursively вместо вызова:
removeSubNodes(crt);
Я бы просто назвал что-то вроде:
crt.left = null;
crt.right = null;
Надеюсь, это поможет, С наилучшими пожеланиями!