Java递归实现二叉树前序遍历返回列表且不使用全局变量
问题根源
cannot find symbol报错原因:preorder_list是main方法内的局部变量,作用域仅限main内部,preorder方法没有访问该变量的权限。- 列表内容清空问题:如果把列表初始化逻辑写在
preorder方法中,每次递归调用都会新建空列表,无法累积遍历结果。 - 现有代码逻辑错误:
preorder_list.add(root)添加的是节点对象本身,题目要求返回节点存储的数据,需调用root.getData()取值后再存入列表。
符合要求的实现方案
题目禁止全局变量、要求递归实现、不能修改给定的对外方法签名,最稳妥的实现方式是用私有递归辅助方法:
- 在对外暴露的
preorder方法入口处,仅初始化一次结果列表 - 写一个私有的辅助递归方法,把当前遍历节点、结果列表作为参数传入,整个递归过程复用同一个列表,不会出现重复初始化问题
- 严格按照前序遍历「根节点->左子树->右子树」的顺序执行递归
修正后的preorder相关代码如下:
public List<T> preorder(TreeNode<T> root) { List<T> result = new ArrayList<>(); preorderRecurse(root, result); return result; } private void preorderRecurse(TreeNode<T> current, List<T> result) { if (current == null) { return; } result.add(current.getData()); preorderRecurse(current.getLeft(), result); preorderRecurse(current.getRight(), result); }
测试提示:你当前的
main方法只完成了树结构搭建,没有调用遍历方法,可在树构建代码后补充如下内容验证结果:List<Integer> preorderRes = tree.preorder(root); System.out.println(preorderRes); // 你搭建的测试树正确前序输出为 [50, 25, 10, 100, 75, 125, 110]
中序、后序遍历可以沿用完全相同的实现思路,仅需调整节点数据添加的位置即可:
- 中序遍历:先递归左子树,再添加当前节点数据,最后递归右子树
- 后序遍历:先递归左子树,再递归右子树,最后添加当前节点数据
内容的提问来源于stack exchange,提问作者Jdonza
相关产品推荐
相关产品推荐

