【LeetCode】Path Sum II

133 篇文章 0 订阅
121 篇文章 2 订阅

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 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);
    }  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值