• 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ


    题目描述:

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

    输入:

    每个测试案例包括n+1行:

    第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n。                                                                                                       

    接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode,vi表示第i个结点的值,leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号,若无结点值为-1。编号为1的结点为根结点。

    输出:

    对应每个测试案例,先输出“result:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。

    样例输入:

    5 22
    10 2 3
    5 4 5
    12 -1 -1
    4 -1 -1
    7 -1 -1
    1 5
    1 -1 -1

    样例输出:
    

    result:
    A path is found: 1 2 5
    A path is found: 1 3
    result:
    【解题思路】这道题目的思路应该还是比较清晰的,首先DFS是基础,然后在DFS过程中记录下经过的节点,并注意随时更新路径的和值,当然也需要动态的维护好经过节点的序列,注意增删,也即访问节点的时候需要增,当需要往回撤时需要删除节点。最后需要对保存的结果序列排序。

    AC code:

    #include <cstdio>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    struct tre
    {
      int val,lc,rc;
    };
     
    void dfs(const int&idx,vector<vector<int> > &re,int &all,vector<int> &vec,vector<tre> &vect,const int&k)
    {
      vec.push_back(idx);
      all+=vect[idx].val;
      if(vect[idx].lc==-1 && vect[idx].rc==-1)
      {
        if(all==k)
          re.push_back(vec);
        return;
      }
      if(vect[idx].lc!=-1)
      {
        dfs(vect[idx].lc,re,all,vec,vect,k);
        all-=vect[vect[idx].lc].val;
        vec.pop_back();
      }
      if(vect[idx].rc!=-1)
      {
        dfs(vect[idx].rc,re,all,vec,vect,k);
        all-=vect[vect[idx].rc].val;
        vec.pop_back();
      }
    }
     
    bool cmp(const vector<int> &vec1,const vector<int> &vec2)
    {
      for(int i=0;i<vec1.size();++i)
        if(vec1[i]!=vec2[i])
          return vec1[i]<vec2[i];
    }
     
    int main()
    {
      int n,k;
      while(scanf("%d%d",&n,&k)!=EOF)
      {
        vector<tre> vect(n+1);
        tre st;
        for(int i=1;i<=n;++i)
        {
          scanf("%d%d%d",&st.val,&st.lc,&st.rc);
          vect[i]=st;
        }
        vector<vector<int> > re;
        vector<int> vec;
        int all=0;
        dfs(1,re,all,vec,vect,k);
        printf("result:
    ");
        if(re.size())
        {
          sort(re.begin(),re.end(),cmp);
          for(int i=0;i<re.size();++i)
          {
            printf("A path is found:");
            for(int j=0;j<re[i].size();++j)
              printf(" %d",re[i][j]);
            printf("
    ");
          }
        }
      }
      return 0;
    }
    /**************************************************************
        Problem: 1368
        User: huo_yao
        Language: C++
        Result: Accepted
        Time:50 ms
        Memory:1468 kb
    ****************************************************************/
    题目链接:http://ac.jobdu.com/problem.php?pid=1368

    九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299



    
    

  • 相关阅读:
    SHELL
    Docker
    RHCE内容记要
    mysql基本知识的总结
    Linux启动提示Kernel panic
    配置tomcat、nginx实现反向代理(需操作)
    linux下nginx的安装和配置
    linux下安装mysql5.7(centos6.0)
    linux打包解压包(.tar .gz .tar.gz .zip)
    多重继承下的类型转换
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248896.html
Copyright © 2020-2023  润新知