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;

Надеюсь, это поможет, С наилучшими пожеланиями!

Другие вопросы по тегам