首页 > 解决方案 > Java Binary InOrder Tree Traversal - 为什么在函数外部初始化 ArrayList 会有所不同?

问题描述

我编写了一个递归函数来将二叉树的所有节点添加到整数类型的列表中,但由于某种原因它一直给我带来问题。这是我的代码最初的样子:

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<>();

有人可以向我解释为什么会有所不同以及为什么最初会失败吗?

标签: javatreebinary-treetraversalinorder

解决方案


因为您正在递归调用“inorderTraversal”,所以每次调用该方法时,它都会覆盖“res”并创建一个新对象。因此,'res' 必须是全局的,以防止发生这种覆盖。


推荐阅读