import java.util.ArrayList; class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public class Solution { ArrayList<Integer> path = new ArrayList<>(); ArrayList< ArrayList<Integer> > list = new ArrayList< ArrayList<Integer> >(); public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { if(root == null) return list; //每访问到一个节点,都把当前的节点添加到路径中去,并调整target的值 path.add(root.val); target -= root.val; //已到叶节点并且和为target,则把当前路径添加到输出列表里 //因为add添加的是引用,如果不new一个的话,最终list保存到的知识最后一个path if(target == 0 && root.left == null && root.right==null) list.add(new ArrayList<Integer>(path)); //否则继续遍历 FindPath(root.left, target); FindPath(root.right, target); //已经到叶节点之后会跳过两个递归函数到这里,此时要把最后一个节点从路径中删除 path.remove(path.size() - 1); return list; } }
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12
![](https://cyc2018.github.io/CS-Notes/pics/f5477abd-c246-4851-89ab-6b1cde2549b1.png)