您的位置:首页 > 其它

LeetCode_Path Sum II

2014-02-25 09:00 459 查看

题目

给定一个二叉树,给定一个值,找和的等于这个值的所有路径

思路

经典深度优先搜索题,这类题一般都需要一个cur_sum表示当前已经的加和,每递归一层 先加上根节点的值,如果当前节点是叶子节点检测下值是否为所需和,
递归结构,先递归左子树,将当前左子节点放入栈,递归完再回溯(删除栈顶),再以同样的方式递归右子树,这题没有1A,忘记考虑空树的情况了

代码

/**
* 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) {
int cur_sum=0;
vector<vector<int>>  ans;
vector<int> path;
ans.clear();
path.clear();
if(root==NULL) return ans;
path.push_back(root->val);
checkAndRecord(root,sum,cur_sum,ans,path);
}

bool checkAndRecord(TreeNode *root, int sum ,int cur_sum,vector<vector<int>> &ans,vector<int> &path) //代码风格不好,建树的过程要写一写
{
cur_sum = cur_sum + root->val;
if (root->left==NULL && root->right==NULL)//到达叶子节点
{
if (  cur_sum==sum)
{
ans.push_back(path);
return true;
}
else
return false;
}
bool flag1=false,flag2=false;
if (root->left!=NULL)  {
path.push_back(root->left->val);
flag1=checkAndRecord(root->left,sum,cur_sum,ans,path);
path.erase(path.end()-1);
}
if(root->right!=NULL){
path.push_back(root->right->val);
flag2 =checkAndRecord(root->right,sum,cur_sum,ans,path);
path.erase(path.end()-1);
}
return flag1 || flag2;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: