题目描述:

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

输入:

每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。

样例输入:

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

  1. AC code
  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. struct tre
  6. {
  7.   int val,lc,rc;
  8. };
  9. void dfs(const int&idx,vector<vector<int> > &re,int &all,vector<int> &vec,vector<tre> &vect,const int&k)
  10. {
  11.   vec.push_back(idx);
  12.   all+=vect[idx].val;
  13.   if(vect[idx].lc==-1 && vect[idx].rc==-1)
  14.   {
  15.     if(all==k)
  16.       re.push_back(vec);
  17.     return;
  18.   }
  19.   if(vect[idx].lc!=-1)
  20.   {
  21.     dfs(vect[idx].lc,re,all,vec,vect,k);
  22.     all-=vect[vect[idx].lc].val;
  23.     vec.pop_back();
  24.   }
  25.   if(vect[idx].rc!=-1)
  26.   {
  27.     dfs(vect[idx].rc,re,all,vec,vect,k);
  28.     all-=vect[vect[idx].rc].val;
  29.     vec.pop_back();
  30.   }
  31. }
  32. bool cmp(const vector<int> &vec1,const vector<int> &vec2)
  33. {
  34.   for(int i=0;i<vec1.size();++i)
  35.     if(vec1[i]!=vec2[i])
  36.       return vec1[i]<vec2[i];
  37. }
  38. int main()
  39. {
  40.   int n,k;
  41.   while(scanf("%d%d",&n,&k)!=EOF)
  42.   {
  43.     vector<tre> vect(n+1);
  44.     tre st;
  45.     for(int i=1;i<=n;++i)
  46.     {
  47.       scanf("%d%d%d",&st.val,&st.lc,&st.rc);
  48.       vect[i]=st;
  49.     }
  50.     vector<vector<int> > re;
  51.     vector<int> vec;
  52.     int all=0;
  53.     dfs(1,re,all,vec,vect,k);
  54.     printf("result:\n");
  55.     if(re.size())
  56.     {
  57.       sort(re.begin(),re.end(),cmp);
  58.       for(int i=0;i<re.size();++i)
  59.       {
  60.         printf("A path is found:");
  61.         for(int j=0;j<re[i].size();++j)
  62.           printf(" %d",re[i][j]);
  63.         printf("\n");
  64.       }
  65.     }
  66.   }
  67.   return 0;
  68. }
  69. /**************************************************************
  70.     Problem: 1368
  71.     User: huo_yao
  72.     Language: C++
  73.     Result: Accepted
  74.     Time:50 ms
  75.     Memory:1468 kb
  76. ****************************************************************/
  77. 题目链接:http://ac.jobdu.com/problem.php?pid=1368

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

  1.  

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

  1. 《剑指offer》— JavaScript(24)二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 前序遍历二叉树, ...

  2. (剑指Offer)面试题25:二叉树中和为某一值的路径

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

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

    题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路: dfs一下就可以了.一般dfs肯定递归写比 ...

  4. 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ

    题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...

  5. 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...

  6. 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ

    题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...

  7. 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...

  8. 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ

    题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

  9. 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ

    题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...

随机推荐

  1. eclipse配置tomcat后修改server.xml文件(如编码等)无效问题

    我们用eclipse配置好tomcat后,在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml等文件. 修改后重启Tomcat服务器时发现xml文件又被还原了. 因为Tomc ...

  2. ubuntu 命令记录

    1.su root  进入root模式 2.ifconfig 查看ip地址 3.ls 查看文件 4./etc/init.d/matrix-gui-2.0 stop 关闭matrix界面 5.cd /文 ...

  3. 22 严格模式&this关键词&let&const

    严格模式: ECMA5后的新指令:"use strict" 它不算一条语句,而是一段文字表达式,更早版本的JavaScript会忽略它. 严格模式无法使用未声明的变量. 严格模式的 ...

  4. 吴裕雄--天生自然Numpy库学习笔记:NumPy Matplotlib

    Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 PyQt 和 wxPython. W ...

  5. Fiddler过滤VsHub请求

    Fiddler过滤掉VS2015 VsHub请求 打开VS2015, Tools --> Options --> Debugging --> General --> unche ...

  6. Jquery 事件 文本框常用

    1.只许输入类型 //只能输入整数和小数 function txtKeyUpDecimal(txtName) { getID(txtName).keyup(function(){ //keyup事件处 ...

  7. openjudge 和为给定数(二分答案)

    嗯... 题目链接:http://noi.openjudge.cn/ch0111/07/ 这道题是一道不太明显,但很好二分的二分答案的一道题... 首先排序(二分要满足单调性),然后枚举每一个数,在[ ...

  8. if条件语句!

    1.if 单分支语句 if [ 条件语句 ]  then 条件操作fi 例子: [root@localhost ~]# if [ 1 -eq 0 ]                    //如果1等 ...

  9. 解决springmvc拦截器拦截静态资源的两种方式

    1.是采用<mvc:default-servlet-handler />,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomca ...

  10. vim功能之替换和查找

    vim有着强大的替换和查找功能,若能进行熟练的运用,可以让工作效率得到一个很大程度的提高. 替换 语法:[addr]s/源字符串/目的字符串/[option] [addr]表示检索范围,如: &quo ...