如何创建存储二叉树到空节点所有路径的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
相关产品推荐
相关产品推荐

