Java Двоичный обход дерева InOrder - почему эта инициализация arralist вне функции имеет значение? - PullRequest
0 голосов
/ 11 января 2020

Я написал рекурсивную функцию для добавления всех узлов бинарного дерева в список целочисленных типов, но по какой-то причине он продолжал вызывать у меня проблемы. Вот как первоначально выглядел мой код:

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    helper(root, res);
    return res;
}

public void helper(TreeNode root, List<Integer> res){
    if(root == null){
        return;
    }
    inorderTraversal(root.left);
    res.add(root.val);
    inorderTraversal(root.right);
}

Однако он продолжал давать сбой и не давал мне правильного решения. Но оказывается, что этот код работает, если взять первую строку из функции "inorderTraversal" и сделать ее глобальной:

List<Integer> res = new ArrayList<>();

Может кто-нибудь объяснить мне, почему это имеет значение и почему это было изначально неудачу?

1 Ответ

0 голосов
/ 11 января 2020

Поскольку вы вызываете 'inorderTraversal' рекурсивно, каждый раз, когда вызывается этот метод, он перезаписывает 'res' и создает новый объект. Таким образом, «res» должен быть глобальным, чтобы предотвратить эту перезапись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...