• 【剑指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();
            }
        }
    };
  • 相关阅读:
    DataGrid数据格式设置表达式
    删除确认按钮
    获取CpuID
    R0~R31寄存器
    动态改变asp.net网页的标题
    使用"Infragistics"问题集
    Read Cpu Id
    操作DataRow记录
    用Javascript创建"后退"按钮
    日历控件的“星期几”变为“几”
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4705944.html
Copyright © 2020-2023  润新知