Given a binary tree, find all paths that sum of the nodes in the path equals to a given number target
.
A valid path is from root node to any of the leaf nodes.
Example
Given a binary tree, and target = 5
:
1
/
2 4
/
2 3
return
[
[1, 2, 2],
[1, 4]
]
分治法。拆解为在子树里找凑出(target-root.value)的值的问题,一直推到叶子节点来解决。如果叶子节点的val正好target重合了,就说明root到这个叶子节点这一路是可行的。题目还关注了下List数据结构的操作,逻辑理清楚。
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /* * @param root: the root of binary tree * @param target: An integer * @return: all valid paths */ public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) { // write your code here List<List<Integer>> result = new ArrayList<List<Integer>>(); if (root == null) { return result; } if (root.left == null && root.right == null && root.val == target) { List<Integer> newPath = new ArrayList<Integer>(); newPath.add(root.val); result.add(newPath); return result; } List<List<Integer>> left = binaryTreePathSum(root.left, target - root.val); List<List<Integer>> right = binaryTreePathSum(root.right, target - root.val); for (List<Integer> path : left) { List<Integer> newPath = new ArrayList<Integer>(); newPath.add(root.val); newPath.addAll(path); result.add(newPath); } for (List<Integer> path : right) { List<Integer> newPath = new ArrayList<Integer>(); newPath.add(root.val); newPath.addAll(path); result.add(newPath); } return result; } }