Path Sum II
Total Accepted: 4441 Total Submissions: 16502 My Submissions
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
和 Path Sum一样,解题思路参考 LeetCode/Path Sum仍然是BFS和DFS,只不过要求出路径。
Total Accepted: 4441 Total Submissions: 16502 My Submissions
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] ]Discuss
和 Path Sum一样,解题思路参考 LeetCode/Path Sum仍然是BFS和DFS,只不过要求出路径。
Java AC BFS
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
if(root == null){
return new ArrayList<ArrayList<Integer>>();
}
return bfs(root, sum);
}
public ArrayList<ArrayList<Integer>> bfs(TreeNode root, int sum){
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
Queue<NodeSum> nodeQueue = new LinkedList<NodeSum>();
StringBuffer sb = new StringBuffer(root.val+" ");
nodeQueue.offer(new NodeSum(root,root.val,sb));
while(!nodeQueue.isEmpty()){
NodeSum node = nodeQueue.peek();
nodeQueue.poll();
if(node.node.left == null && node.node.right == null && node.sum == sum){
ArrayList<Integer> tempList = new ArrayList<Integer>();
String msg[] = node.sb.toString().trim().split(" ");
int len = msg.length;
for(int i = 0; i < len; i++){
tempList.add(Integer.parseInt(msg[i]));
}
list.add(tempList);
}
TreeNode point = node.node;
StringBuffer newsb = new StringBuffer(node.sb);
int newSum = node.sum;
if(point.left != null){
point = point.left;
newsb.append(point.val+" ");
nodeQueue.offer(new NodeSum(point,(newSum + point.val),newsb));
}
newsb = new StringBuffer(node.sb);
point = node.node;
if(point.right != null){
point = point.right;
newsb.append(point.val+" ");
nodeQueue.offer(new NodeSum(point,(newSum + point.val),newsb));
}
}
return list;
}
public class NodeSum {
int sum ;
TreeNode node;
StringBuffer sb ;
NodeSum(TreeNode root ,int sum, StringBuffer sb){
super();
this.node = root;
this.sum = sum;
this.sb = sb;
}
}
}
Java AC DFS
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
if(root == null){
return new ArrayList<ArrayList<Integer>>();
}
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
List<String> numList = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
dfs(root, numList ,sb, 0, sum);
int size = numList.size();
for(int i = 0; i < size; i++){
ArrayList<Integer> tempList = new ArrayList<Integer>();
String msg[] = numList.get(i).split(" ");
for (int j = 0; j < msg.length; j++) {
tempList.add(Integer.parseInt(msg[j]));
}
list.add(tempList);
}
return list;
}
public void dfs(TreeNode point, List<String> numList,
StringBuffer sb ,int allsum, int sum){
if (point == null) {
return;
}
if(point.left == null && point.right == null){
sb.append(point.val+" ");
if (allsum+point.val == sum) {
String tempStr = sb.toString().trim();
numList.add(tempStr);
}
}
StringBuffer newsb = new StringBuffer(sb);
sb.append(point.val+" ");
dfs(point.left, numList, sb, allsum+point.val, sum);
newsb.append(point.val+" ");
dfs(point.right, numList, newsb, allsum+point.val, sum);
}
}