题目:
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] ]题意:
给定一棵二叉树和一个目标和,然后遍历整棵二叉树,查看是否有路径上的和等于给定的这个目标和。
题解:
这道题是典型的采用递归+回溯的树的题。首先采用递归来遍历左右子树,然后再通过回溯到某一个节点来计算相应的值。在每一次找到了相应的路径的时候,都设置一个临时的ArrayList,用来保存相应的路径,然后再一次性地将这个路径保存进相应的要输出的list中。
public class ReOrder
{
public List<ArrayList<Integer>> pathSum(TreeNode root,int sum)
{
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(root == null)
return result;
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(root.val);
dfs(root,sum-root.val,result,list);
return result;
}
public void dfs(TreeNode root,int sum,ArrayList<ArrayList<Integer>> result,ArrayList<Integer> list)
{
if(root.left == null && root.right == null && sum == 0)
{
ArrayList<Integer> temp = new ArrayList<Integer>(); //设立了一个临时的arraylist
temp.addAll(list); //将所有的list全部加到temp中
result.add(temp);
}
if(root.left != null) //递归遍历
{
list.add(root.left.val);
dfs(root.left,sum - root.left.val,result,list);
//System.out.println(list.size() - 1);
list.remove(list.size() - 1); //这一步是为了回到根节点
}
if(root.right != null)
{
list.add(root.right.val);
dfs(root.right,sum - root.right.val,result,list);
list.remove(list.size() - 1); //为了回到根节点
}
}
}
还有一种也可以:
public class Solution
{
public List<List<Integer>> pathSum(TreeNode root, int sum)
{
List<List<Integer>> results=new ArrayList<List<Integer>>();
Stack<Integer> path=new Stack<Integer>();
pathSum(root,sum,path,results);
return results;
}
private void pathSum(TreeNode root,int sum,Stack<Integer> path,List<List<Integer>> results)
{
if(root==null)
{
return;
}
path.push(root.val);
if(root.left==null && root.right==null)
{
if(sum==root.val)
{
results.add((Stack<Integer>)(path.clone()));
}
}
pathSum(root.left,sum-root.val,path,results);
pathSum(root.right,sum-root.val,path,results);
path.pop();
}
}