Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example:
Given the below binary tree and sum = 22
,
5 / 4 8 / / 11 13 4 / / 7 2 5 1
return
[ [5,4,11,2], [5,8,4,5] ]
方法1:只要在每个树节点中加入一个父节点,就可以用上一题的解法了。
方法2:dfs
方法1的代码:
1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 12 class TreeNodePlus { 13 TreeNode node; 14 TreeNodePlus father; 15 TreeNodePlus(TreeNode x,TreeNodePlus f) { 16 node=x; 17 father=f; 18 } 19 } 20 21 List<List<Integer>> paths = new ArrayList<List<Integer>>(); 22 23 public List<List<Integer>> pathSum(TreeNode root, int sum) { 24 TreeNodePlus newRoot = new TreeNodePlus(root, null); 25 hasPathSum(newRoot, sum); 26 return paths; 27 } 28 29 public void hasPathSum(TreeNodePlus root, int sum){ 30 if (root.node == null) { 31 return ; 32 } 33 if (root.node.val==sum && root.node.left==null && root.node.right==null) { 34 ArrayList<Integer> list = new ArrayList<Integer>(); 35 TreeNodePlus father = root; 36 while (father != null) { 37 list.add(0,father.node.val); 38 father = father.father; 39 40 } 41 paths.add(list); 42 return; 43 } 44 45 hasPathSum(new TreeNodePlus(root.node.left,root), sum-root.node.val) ; 46 hasPathSum(new TreeNodePlus(root.node.right,root), sum-root.node.val); 47 } 48 49 }
方法2的代码
1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 12 13 14 List<List<Integer>> paths = new ArrayList<List<Integer>>(); 15 public List<List<Integer>> pathSum(TreeNode root, int sum) { 16 17 List<Integer> list = new ArrayList<Integer>(); 18 dfs(root, sum, 0, list); 19 return paths; 20 } 21 void dfs(TreeNode root, int sum, int curr, List<Integer> list) { 22 if (root == null) { 23 return; 24 } 25 26 if (root.left == null && root.right == null) { 27 if (curr + root.val == sum) { 28 list.add(root.val); 29 paths.add(list); 30 31 } 32 return; 33 } 34 35 list.add(root.val); 36 dfs(root.left, sum, curr + root.val, new ArrayList<Integer>(list)); 37 38 dfs(root.right, sum, curr + root.val, new ArrayList<Integer>(list)); 39 } 40 41 }