【剑指offer】面试题25:二叉树中和为某一值的路径

时间:2021-03-13 20:33:47

题目:

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

思路:

dfs一下就可以了。一般dfs肯定递归写比较方便。

注意,递归的结束条件是遇到叶节点,而不是遇到空指针。(如果是遇到空指针,则叶节点相当于判断了两次,然而写出来的代码出现了段错误,不知道为什么)

相关:树求和(里面好像dfs用循环写的~)

代码:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<vector<int> >  res;
        if(root==NULL)  return res;
        
        vector<TreeNode*>  vec;
        vec.push_back(root);
        dfs(root,0,expectNumber,vec,res);
        
        return res;
    }
private:
    void dfs(TreeNode* root,int sum,int expectNumber,vector<TreeNode*> &vec,vector<vector<int> > &res)
    {
        if(root->left==NULL && root->right==NULL)//递归结束条件应该是叶节点;而不是root==NULL
        {
            if((sum+root->val)==expectNumber)
            {
                vector<int>  intvec;
                for(int i=0;i<vec.size();++i)
                    intvec.push_back(vec[i]->val);
                res.push_back(intvec);//vector的该成员函数是以复制的方式加入
            }
        }
        else
        {
            if(root->left)
            {
                vec.push_back(root->left);
                dfs(root->left,sum+root->val,expectNumber,vec,res);//因为直接以sum+root->val参数传入的,所以后面不用恢复sum
                vec.pop_back();
            }
            
            if(root->right)
            {
                vec.push_back(root->right);
                dfs(root->right,sum+root->val,expectNumber,vec,res);
                vec.pop_back();
            }
        }
    }
};

递归结束条件是空指针时的代码(有段错误)

提交时间:2015-08-05 21:13:54 语言:C++ 状态:段错误
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<vector<int> >  res;
        if(root==NULL)  return res;
         
        vector<TreeNode*>  vec;
        vec.push_back(root);
        dfs(root,0,expectNumber,vec,res);
         
        return res;
    }
private:
    void dfs(TreeNode* root,int sum,int expectNumber,vector<TreeNode*> vec,vector<vector<int> > &res)
    {
        if(root==NULL)
        {
            if(sum==expectNumber)
            {
                vector<int>  intvec;
                for(int i=0;i<vec.size();++i)
                    intvec.push_back(vec[i]->val);
                res.push_back(intvec);//vector的该成员函数是以复制的方式加入
            }
        }
        else
        {
            vec.push_back(root->left);
            dfs(root->left,sum+root->val,expectNumber,vec,res);//因为直接以sum+root->val参数传入的,所以后面不用恢复sum
            vec.pop_back();
             
            vec.push_back(root->right);
            dfs(root->right,sum+root->val,expectNumber,vec,res);
            vec.pop_back();
        }
    }
};