• 【剑指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



    
    

  • 相关阅读:
    VB.Command()的参数
    XAMPP 启动mysql报错 InnoDB: Error: could not open single-table tablespace file……
    在不安装Windows服务的情况下,如何进行调试或测试
    Java基础东西(按位操作运算)
    浅谈web应用的负载均衡、集群、高可用(HA)解决方案
    关于CSDN, cnblog, iteye和51cto四个博客网站的比较与分析
    bzoj2243[SDOI2011]染色
    洛谷P2740 [USACO4.2]草地排水Drainage Ditches
    bzoj4198[noi2015]荷马史诗
    矩阵快速幂模板(pascal)
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248896.html
Copyright © 2020-2023  润新知