【剑指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张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
随机推荐
- php引入html页面 css报错 404
php引入html页面 css报错 404, html页面内 有css, 有一样 是这么写的 结果就报错了, 原来是 -moz这一句,在这句前面随便加一句别的样式就可以....
- python匿名函数与三元运算
匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y): return x*y print(calc(2,3)) # 换成匿名函数 calc = lambda ...
- CAN总线学习笔记
1.CAN总线信息包的格式 问题: 1.CAN总线的初始化要初始化哪些东西? 2.处理器如何与CAN总线之间进行连接? 硬件连接 关于CC2底盘CAN通信的协议格式 备注: 设备地址为01 功能码
- 「题解」「JOISC 2014 Day1」历史研究
目录 题目 考场思考 思路分析及标程 题目 点这里 考场思考 大概是标准的莫队吧,离散之后来一个线段树加莫队就可以了. 时间复杂度 \(\mathcal O(n\sqrt n\log n)\) . 然 ...
- ES5-bind用法及与以前的apply和call
当我们调用一个函数的时候,函数中的this一般是指向调用者的.但是我们其实可以在调用函数的时候,传入一个对象,让函数中的this指向我们传入的对象,而不是调用者本身. apply,call,bind都 ...
- 使用docker构建第一个spring boot项目
在看了一些简单的docker命令之后 打算自己尝试整合一下docker+spring boot项目本文是自己使用docker+spring boot 发布一个项目1.docker介绍 docke是提供 ...
- Update(Stage4):spark_rdd算子:第2节 RDD_action算子_分区_缓存:缓存、Checkpoint
4. 缓存 概要 缓存的意义 缓存相关的 API 缓存级别以及最佳实践 4.1. 缓存的意义 使用缓存的原因 - 多次使用 RDD 需求: 在日志文件中找到访问次数最少的 IP 和访问次数最多的 IP ...
- 「AT4741 [ABC132D] Blue and Red Balls」
题目大意 给出一个长度为 \(N\) 的01串,其中有 \(K\) 个 \(1\),其他都是 \(0\),需要求出当着 \(K\) 个 \(1\) 分成 \(1\) 到 \(K\) 段每一个的方案数. ...
- Redis Hash 基本操作
public void StoreHash(string key,string value) { _redisClient.SetEntryInHash("test", key, ...
- vue通过get方法下载java服务器excel模板
vue方法 handleDownTemplateXls(fileName){ if(!fileName || typeof fileName != "string"){ fileN ...