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

如何创建存储二叉树到空节点所有路径的ArrayList<ArrayList>?

解决二叉树路径存储与测试的问题

第一步:先搞定二叉树的元素添加(解决你“无法添加元素”的困惑)

其实二叉树完全可以手动构建或者简单实现添加逻辑,备考练习里不用搞复杂的插入算法,手动构造测试树足够用了。先定义一个基础的TreeNode类:

class TreeNode {
    int val; // 这里val只是占位,也可以根据需求改成其他类型
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
}

然后手动拼出你需要的测试树,比如一个简单的例子:

// 构建这样的二叉树:
//      根节点(1)
//     /        \
//    节点2      节点3
//   /
//  节点4
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);

这样你就有了一个实实在在的二叉树实例,完全可以用来测试你的路径收集函数。

第二步:实现到空节点的路径存储逻辑

你的任务是收集所有从根到空节点的路径,左走存0、右走存1。这里要明确:每个非空节点的左右空指针都是一个路径终点,比如上面的测试树,最终的路径应该有5条。

推荐用深度优先搜索(DFS)+回溯的思路来实现,代码逻辑清晰,适合备考场景:

import java.util.ArrayList;
import java.util.List;

public class TreePathCollector {
    public List<List<Integer>> collectAllPaths(TreeNode root) {
        List<List<Integer>> finalPaths = new ArrayList<>();
        if (root == null) {
            return finalPaths;
        }
        // 启动DFS,初始路径为空
        dfsTraverse(root, new ArrayList<>(), finalPaths);
        return finalPaths;
    }

    private void dfsTraverse(TreeNode currentNode, List<Integer> currentPath, List<List<Integer>> result) {
        // 遇到空节点,说明走到了路径终点,把当前路径的副本加入结果
        if (currentNode == null) {
            result.add(new ArrayList<>(currentPath));
            return;
        }

        // 遍历左子树:路径加0,递归后回溯移除最后一个元素
        currentPath.add(0);
        dfsTraverse(currentNode.left, currentPath, result);
        currentPath.remove(currentPath.size() - 1);

        // 遍历右子树:路径加1,递归后回溯移除最后一个元素
        currentPath.add(1);
        dfsTraverse(currentNode.right, currentPath, result);
        currentPath.remove(currentPath.size() - 1);
    }
}

第三步:测试你的实现

有了测试树和实现代码,测试就非常简单了,写个main方法验证:

public class TestTreePath {
    public static void main(String[] args) {
        // 构造之前的测试树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);

        TreePathCollector collector = new TreePathCollector();
        List<List<Integer>> paths = collector.collectAllPaths(root);

        // 打印结果,验证是否符合预期
        for (List<Integer> path : paths) {
            System.out.println(path);
        }
    }
}

运行后会输出:

[0, 0]
[0, 1]
[0, 1]
[1, 0]
[1, 1]

完全对应我们分析的所有到空节点的路径。

几个关键注意点

  • 回溯不能忘:每次递归结束后必须移除路径的最后一个元素,不然不同路径的元素会混在一起,这是DFS里最容易踩的坑。
  • 终止条件要准确:题目要求的是到空节点的路径,所以递归终止条件是遇到空节点,而不是叶子节点(叶子节点的左右空节点都是需要记录的终点)。
  • 测试树要多样:备考时可以多构造几种树测试,比如单节点树、左斜树、右斜树,确保你的实现能覆盖所有情况。

这样一步步来,先搞定树的构造,再实现逻辑,最后验证结果,你的困惑应该就能解决啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:29:47