【剑指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:\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
【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ的更多相关文章
- 《剑指offer》— JavaScript(24)二叉树中和为某一值的路径
二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 前序遍历二叉树, ...
- (剑指Offer)面试题25:二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二叉树结点的定义: struct TreeNode ...
- 【剑指offer】面试题25:二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路: dfs一下就可以了.一般dfs肯定递归写比 ...
- 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ
题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...
- 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...
- 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...
- 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ
题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...
- 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
随机推荐
- 疯狂python(分享本不错的书)
网盘链接:https://pan.baidu.com/s/1JDawVe8CT9BsHav5gBZS6Q 提取码vg8k
- pycharm连接数据库报错Access denied for user 'root'@'localhost' (using password:YES),以及wampserver 2/3个服务器正在运行 问题
使用mysql版本为mysql5.7,参考下列 https://blog.csdn.net/qq_32969455/article/details/79051932 https://blog.csdn ...
- 计算机二级-C语言-程序填空题-190117记录-对文件的处理,复制两个文件,往新文件中写入数据。
//给定程序的功能是,调用函数fun将指定源文件中的内容赋值到指定目标文件中,复制成功时函数返回1,失败时返回0,把复制的内容输出到终端屏幕.主函数中源文件名放在变量sfname中,目标文件名放在变量 ...
- agc026F Lotus Leaves
题目链接 题目大意 一个n*m的网格上有一些点,一个点可以跳到与其同一行或同一列的点上.给定起点和终点. 求要使起点不能跳到终点,最少撤走几个点. \(n,m\leq 100\) 解题思路 考虑将能够 ...
- python中安装下载超时,下载不了安装包
python3 -m pip install scapy 执行上面命令报错,下载超时,下载不了安装包 Collecting scapy WARNING: Retrying (Retry(total=4 ...
- 吴裕雄 python 神经网络——TensorFlow 花瓣分类与迁移学习(1)
import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...
- Maven____笔记摘抄
1 1.maven的作用 i.增加第三方Jar (spring-context.jar spring-aop.jar ....) ii.jar包之间的依赖关系 (spring-context.jar ...
- [原]Java工程打包注意事项
注意事项(持续增加...): 如果Java工程中用到了注解,在用eclipse打jar包时需要注意一下,勾上“Add directory entries”,否则注解的类会注册不上
- Java入门笔记 00-前言&目录
前言:这本笔记记录的是Java基础部分的学习内容,大部分内容总结性的,包括: ---01 Java基础语法 ---02 数组 ---03 面向对象 ---04 异常处理 ---05 多线程 ---06 ...
- Git - 删除github上的提交历史
参考 https://segmentfault.com/q/1010000002898735 https://stackoverflow.com/questions/1338728/delete-co ...