【问题标题】:Java Binary InOrder Tree Traversal - why does this initializing the ArrayList outside of the function make a difference?Java Binary InOrder Tree Traversal - 为什么在函数外部初始化 ArrayList 会有所不同?
【发布时间】:2020-01-10 21:26:23
【问题描述】:

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

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

有人可以向我解释为什么这会产生影响以及为什么最初会失败吗?

【问题讨论】:

    标签: java tree binary-tree traversal inorder


    【解决方案1】:

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

    【讨论】:

    • 但我不是递归调用助手吗?而不是“inorderTraversal”函数?
    • 从技术上讲,这些函数都不是递归的,因为它们不会调用自己。但是当您将 root.val 添加到 res 时,您会再次调用 inOrderTraversal,这会创建一个新对象。看看 [cs.cornell.edu/courses/cs2112/2018fa/lectures/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2010-09-29
    • 2021-12-31
    • 2020-02-04
    相关资源
    最近更新 更多