Path Sum II(medium)

[题目]  

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]
]

Subscribe to see which companies asked this question

[题意]

    求出满足sum是22的所有路径

[分析]

    利用递归的方法,当左右子节点都是NULL的时候能够判断当前节点是叶子节点。根据Path Sum相比,这道题是要求出路径,故在找到满足的路径之后,不能直接返回,而是将其添加到一个ArrayList<ArrayList<int>>中。在查找的途中,每经过一个结点,先使用一个ArrayList<int>将该路径中的所有结点记录下来。

[实现]

/** 
 * Definition for a binary tree node. 
 * public class TreeNode { 
 *     int val; 
 *     TreeNode left; 
 *     TreeNode right; 
 *     TreeNode(int x) { val = x; } 
 * } 
 */ 
public
public class Solution {
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> path = new ArrayList<Integer>();
	public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
        getSum(root, 0, sum);
        return result;
    }
	public void getSum(TreeNode root, int sum, int target){
		if(root == null) return;
		sum+= root.val;
		path.add(root.val);
		if(root.left == null && root.right == null && sum== target)
			result.add(new ArrayList<>(path));
		getSum(root.left, sum, target);
		getSum(root.right, sum, target);
		sum-=root.val;
		path.remove(path.size()-1);
		return;
	}
}
//Definition for binary tree
struct TreeNode
{
  int val;
  TreeNode *left;
  TreeNode *right;
  TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution
{
public:
  vector<vector<int> > pathSum(TreeNode *root, int sum)
  {
    vector<vector<int> > path;
    vector<int> tmp;
    hasPathSum(root,sum,path,tmp);
    return path;
  }
  void hasPathSum(TreeNode *root, int sum,vector<vector<int> > &path,vector<int> tmp)
  {
    if(root==NULL)
      return;
    tmp.push_back(root->val);
    if(root->left==NULL&&root->right==NULL&&(sum-root->val)==0)
    {
      path.push_back(tmp);
    }
    if(root->left)
      hasPathSum(root->left,sum-root->val,path,tmp);
    if(root->right)
      hasPathSum(root->right,sum-root->val,path,tmp);
  }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值