Leetcode题 112 和 113. Path Sum I and II

112题目如下:

 

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

For example:
Given the below binary tree and sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

113题目如下:

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

112和113题目是类似的,都是找出等于给定值的路径,不过前者只看有没有,后者是要输出所有符合条件的路径。

112由于只要看有没有等于给定值的路径,所以可以用BFS,将每个树节点的val改为从根节点到当前节点的距离,这样改到树的叶子节点的时候,就可以判断是否有叶子节点的距离值符合要求。

113由于需要输出所有符合条件的路径,如果树节点的数据结构不可以改,那这就不适合用BFS,因为如果用BFS需要在每个树节点里维护一个到达当前节点经过的节点记录;所以这里改用DFS,通过修改一个存储路径的vector来统计所有满足条件的路径。

112题目代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        queue<TreeNode*> q;
        vector<TreeNode*> v;
        if(root==NULL) return false;
        q.push(root);
        TreeNode* p=root;
        while(q.size()!=0)
        {
            p=q.front();
            q.pop();
            if(p->left!=NULL)
            {
                p->left->val+=p->val;
                q.push(p->left);
            }
            if(p->right!=NULL)
            {
                p->right->val+=p->val;
                q.push(p->right);
            }
            if(p->left==NULL && p->right==NULL)
                v.push_back(p);
        }
        for(int i=0;i<v.size();i++)
            if(v[i]->val==sum) return true;
        return false;
        
    }
};

113题目代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //用来递归的函数
    void findSum(TreeNode* t,vector<int>& temp, vector<vector<int> >& record, int sum, int cur)
    {
    	temp.push_back(t->val);
    	cur+=t->val;
    	//在叶节点找到了目标值
    	if(cur==sum && t->left==NULL && t->right==NULL) {
    		record.push_back(temp);
    		temp.erase(temp.end()-1);
    		cur-=t->val;
    		return ;
    	}
    	//查找左右节点
    	if(t->left!=NULL) findSum(t->left, temp, record, sum , cur);
    	if(t->right!=NULL) findSum(t->right, temp, record, sum , cur);
    	//返回前更新临时路径的记录和累加和
    	temp.erase(temp.end()-1);
    	cur-=temp[temp.size()-1];
    	return;
    }
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int> > record;//记录最终要返回的路径
        if(root==NULL) return record;
	    vector<int> temp;//记录当前临时路径
	    findSum(root,temp,record,sum,0);
	    return record;
    }
};


posted @ 2016-07-31 15:54  gremount  阅读(149)  评论(0编辑  收藏  举报