You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java递归实现二叉树前序遍历返回列表且不使用全局变量

问题根源
  • cannot find symbol报错原因:preorder_list是main方法内的局部变量,作用域仅限main内部,preorder方法没有访问该变量的权限。
  • 列表内容清空问题:如果把列表初始化逻辑写在preorder方法中,每次递归调用都会新建空列表,无法累积遍历结果。
  • 现有代码逻辑错误:preorder_list.add(root)添加的是节点对象本身,题目要求返回节点存储的数据,需调用root.getData()取值后再存入列表。
符合要求的实现方案

题目禁止全局变量、要求递归实现、不能修改给定的对外方法签名,最稳妥的实现方式是用私有递归辅助方法:

  1. 在对外暴露的preorder方法入口处,仅初始化一次结果列表
  2. 写一个私有的辅助递归方法,把当前遍历节点、结果列表作为参数传入,整个递归过程复用同一个列表,不会出现重复初始化问题
  3. 严格按照前序遍历「根节点->左子树->右子树」的顺序执行递归

修正后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:51:21