题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
牛客传送门:点击打开链接
思路:从根节点开始遍历,当访问一个节点时,list加入这个节点,如果是叶子节点则sum值与target值进行比较,若相等则结果集加入list的clone;
如果不是叶子节点,则遍历它的左右节点。
当退出此节点时,list删除这个节点,sum也减去这个节点值。
public class Title25 {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(root == null)
return result;
ArrayList<Integer> list = new ArrayList<Integer>();
FindPath(result,list,root,target,0);
return result;
}
public void FindPath(ArrayList<ArrayList<Integer>> result,ArrayList<Integer> list,TreeNode node,int target,int sum){
sum += node.val;
list.add(node.val);
// 如果是叶子节点,并且值相等,把list加入结果集
if(node.left == null && node.right == null){
if(sum == target){
result.add((ArrayList)list.clone());
}
}
if(node.left != null && node.left.val + sum <= target){
FindPath(result,list,node.left,target,sum);
}
if(node.right != null && node.right.val + sum <= target){
FindPath(result,list,node.right,target,sum);
}
// 移除本节点
sum -= node.val;
list.remove(list.size()-1);
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
TreeNode a = new TreeNode(10); // 10
TreeNode b = new TreeNode(5); // 5 12
TreeNode c = new TreeNode(12); //4 7
TreeNode d = new TreeNode(4);
TreeNode e = new TreeNode(7);
a.left = b;a.right = c;
b.left = d;b.right = e;
ArrayList<ArrayList<Integer>> result = new Title25().FindPath(a, 22);
for(ArrayList<Integer> list : result){
System.out.println(list);
/*
* [10, 5, 7]
* [10, 12]
*/
}
}
}