描述
给一棵二叉树和一个目标值,设计一个算法找到二叉树上的和为该目标值的所有路径。 路径可以从任何结点出发和结束,但是需要是一条一直往下走的路线。也就是说, 路径上的结点的层级是逐个递增的。
样例
对于二叉树:
1
/ \
2 3
/ /
4 2
给定目标值6。那么满足条件的路径有两条:
[
[2, 4],
[1, 3, 2]
]
思路:
从根结点开始往下遍历二叉树,每遍历一个结点,就把当前结点当做终点,向着根结点往回遍历,返回满足条件的结点
代码
/**
* 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>> binaryTreePathSum2(TreeNode root, int target) {
List<List<Integer>> results = new ArrayList<List<Integer>>();
ArrayList<Integer> buffer = new ArrayList<Integer>();
if (root == null) {
return results;
}
findSum(root, target, 0, buffer, results);
return results;
}
public void findSum(TreeNode head,
int sum,
int level,
ArrayList<Integer> buffer,
List<List<Integer>> results) {
if (head == null) {
return;
}
int tmp = sum;
// buffer缓存数组
buffer.add(head.val);
// 以当前结点为终点往回寻找,如果找回到根结点仍不满足,终点沿着树向下移动
for (int i = level; i >= 0; i--) {
tmp -= buffer.get(i);
// 将满足的和为sum的连续结点(一条完整路径)加入temp数组
// 将路径加入results
if (tmp == 0) {
List<Integer> temp = new ArrayList<Integer>();
for (int j = i; j <= level; j++) {
temp.add(buffer.get(j));
}
results.add(temp);
}
}
findSum(head.left, sum, level + 1, buffer, results);
findSum(head.right, sum, level + 1, buffer, results);
// 回溯,当前结点是叶子结点没办法继续往下走了,沿着树往上走
// 路径中去掉当前结点
buffer.remove(buffer.size() - 1);
}
}