java - 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<>();
有人可以向我解释为什么会有所不同以及为什么最初会失败吗?
解决方案
因为您正在递归调用“inorderTraversal”,所以每次调用该方法时,它都会覆盖“res”并创建一个新对象。因此,'res' 必须是全局的,以防止发生这种覆盖。
推荐阅读
- web-applications - 为什么“-等待锁定(java.io.PrintStream)”线程被阻塞?
- ruby-on-rails - 如果测试环境中存在 webpacker 缓存,有没有办法停止 webpacker:compile?
- python - 将元组数转换为python中的列表列表
- python - 从不同模块在python中进行绝对导入的最佳方法
- java - 如何为这个控制器编写 JUnit?
- javascript - Angular 或 JavaScript 中的注释中的 @license 和 @publicApi 是什么
- java - 使用 Gson 解析时设置默认枚举
- java - 在Java中将long数组转换为int数组
- php - 在数据透视表中复制值并添加不同的字段或创建另一个连接到数据透视表的表更好吗?
- git - 无法从 VSTS 克隆