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

Java中不使用void方法递归遍历二叉树并收集节点数据的正确方式?

二叉树递归前序遍历返回List的正确实现

你当前的代码问题在于每次递归调用preorder都会新建一个独立的ArrayList,递归返回的子树遍历结果没有被合并到当前方法的列表中,所以最终只有根节点的数据被返回。下面是两种符合方法签名要求的正确实现:

方法1:合并递归返回的列表

直接利用递归调用返回的List,通过addAll合并到当前列表中,代码简洁直观:

public List<T> preorder(TreeNode<T> root) {
    List<T> listOfData = new ArrayList<>();
    if (root != null) {
        listOfData.add(root.getData());
        // 将左子树的遍历结果合并到当前列表
        listOfData.addAll(preorder(root.getLeft()));
        // 将右子树的遍历结果合并到当前列表
        listOfData.addAll(preorder(root.getRight()));
    }
    return listOfData;
}

方法2:使用辅助方法(性能更优)

创建一个共享的List,通过私有辅助方法递归填充,避免多次创建和合并List的开销,这是实际开发中更常用的方式:

public List<T> preorder(TreeNode<T> root) {
    List<T> listOfData = new ArrayList<>();
    preorderHelper(root, listOfData);
    return listOfData;
}

// 私有辅助方法,负责递归遍历并填充共享的List
private void preorderHelper(TreeNode<T> root, List<T> list) {
    if (root == null) {
        return;
    }
    list.add(root.getData());
    preorderHelper(root.getLeft(), list);
    preorderHelper(root.getRight(), list);
}

另外需要注意:你提供的void版本的前序遍历代码也是错误的——每次调用preorder都会新建局部的listOfData,递归过程中无法收集所有节点的数据,正确的void遍历应该像上面的辅助方法一样,把List作为参数传入。

内容的提问来源于stack exchange,提问作者BengalTiger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:22:48