import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); /** * * @param root TreeNode类 * @param sum int整型 * @return int整型ArrayList<ArrayList<>> */ public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) { if (root == null) { return result; } ArrayList<Integer> list = new ArrayList<Integer>(); treeDeep(root, sum, list); return result; } public void treeDeep (TreeNode root, int sum, ArrayList<Integer> list) { if (root == null) { return; } //不能这么写 因为有可能整棵树都是负数 要求的sum也是负数 // if (sum < 0) { // return; // } if (root.left == null && root.right == null && sum - root.val == 0) { list.add(root.val); result.add(new ArrayList(list)); //如示例中的二叉树 如sum=10时 541 此时遍历到4的左孩子1叶子节点后,应把1擦除,接着遍历4的右孩子 看是否有路径满足sum=10的 list.remove(list.size() - 1); return; } list.add(root.val); treeDeep (root.left, sum - root.val, list); treeDeep (root.right, sum - root.val, list); //这里的擦除 如sum=11 当遍历到1时 不满足sum=11 此时 应擦除1 接着遍历4的右孩子到叶节点 看是否有满足的 list.remove(list.size() - 1); } }