题目描述:

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

输入:

每个测试案例包括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:\n");
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("\n");
}
}
}
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


最新文章

  1. 八皇后问题_Qt_界面程序实现
  2. 【20160924】GOCVHelper MFC增强算法(2)
  3. python解析xml模块封装代码
  4. Python科学计算(一)环境简介——Anaconda Python
  5. JVM 优化问题
  6. 当前位置: 银光首页 &gt; WPF &gt; WPF学习教程 &gt; WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方
  7. 网易游戏QA工程师笔试回忆-2012.9【个人题解】
  8. Entity SQL 初入
  9. Python使用ctypes访问C代码
  10. [NOI2005]寿司晚宴
  11. ACM 排列2
  12. SQL强化练习(面试与学习必备)
  13. IBM的淘汰之路
  14. Mysql的SQL语句常用基本命令
  15. XAML绑定到资源文件字符串时失败
  16. Hadoop社区版搭建
  17. 前端之js-本地存储-localStorage &amp;&amp; IndexedDB
  18. 【scrapy】爬虫的时候总在提示 KeyError: &#39;novelLabel&#39;
  19. BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)
  20. Bias(偏差),Error(误差),和Variance(方差)的区别和联系

热门文章

  1. Jenkins+Maven+Github+Springboot实现可持续自动部署(非常详细)
  2. P1426
  3. python编程出现:expected an indented block错误。
  4. 计算机二级-C语言-程序填空题-190115记录-fprintf()函数和fscanf()函数的使用。
  5. 学习JavaScript数据结构与算法---前端进阶系列
  6. Ubuntu系统中创建虚拟环境
  7. 操作COOKIE的函数
  8. 基于 VS2019 配置 opencv4.x
  9. 常用es5和es6语法区别,以及三个点的用法
  10. 关于雷达(Radar)信道