zoukankan      html  css  js  c++  java
  • 【剑指offer】面试题25:二叉树中和为某一值的路径

    题目:

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

    思路:

    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();
            }
        }
    };
  • 相关阅读:
    吴裕雄--天生自然 诗经:离思五首·其四
    吴裕雄--天生自然 诗经:江城子·乙卯正月二十日夜记梦
    CentOS6—启动httpd失败—Certificate has expired
    paper—SCI—Examples of author responses to reviewer comments
    paper—SCI答复审稿人的回信技巧
    mysql android—Installation using AndroPHP
    linux socket c : send data when socket close—SIGPIPE, Broken pipe
    Firefox:曾经打破黑暗的产品
    mysql中datetime到time_t转换
    mysql datetime 时间比较
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4705944.html
Copyright © 2011-2022 走看看