剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
题目描述:
-
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入:
-
每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
- 样例输入:
- -
- -
- - - -
- 样例输出:
result:
A path is found:
A path is found:
result:
解题思路:
首先注意题目的两点要求,
1 路径:从根一直到叶子,所有的节点之和是 输入的第二个数。
2 按字典顺序,也就是1在2的前面,比如两条路径 124 13,那么就得是124 13的顺序输出,而不能使13 124的顺序。
做题思路方面:
1 在构造树的时候,左右子树按大小来,保证左孩子比右孩子大,这样我们在扫描的时候,可以按照左子树优先来扫描,保证按字典顺序输出。
for(i=;i<=n;i++){
int l,r;
scanf("%d %d %d",&a->arr[i].num, &l, &r);
if(l<r){
a->arr[i].lchild = l;
a->arr[i].rchild = r;
}else{
a->arr[i].lchild = r;
a->arr[i].rchild = l;
}
}
2 很简单,用栈存储读取过的节点元素,我们这里有个技巧,在函数内部,因为使用形参,而子函数不会对这个形参发生作用,因此,考虑用形参k来标记,是树的第几层,而使用top来当做栈顶。
3 我们从根开始遍历,知道最后叶子时,如果满足条件,则输出:
if(test_sum == sum && a->arr[id].lchild==- && a->arr[id].rchild==- ){
printf("A path is found:");
int i;
for(i=;i<top;i++)
printf(" %d", route[i] );
printf("\n");
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAXSIZE 10005
typedef struct treenode{
int num;
int lchild;
int rchild;
}Tree;
typedef struct treearr{
struct treenode arr[MAXSIZE];
}treeArr; int route[MAXSIZE]={};
int top=; void traceTree(treeArr *a,int id,int sum,int sum_tmp,int n); int main(){
int n,i,sum;
while(scanf("%d %d",&n,&sum)!=EOF){
treeArr *a = (treeArr *)malloc(sizeof(treeArr)); for(i=;i<=n;i++){
int l,r;
scanf("%d %d %d",&a->arr[i].num, &l, &r);
if(l<r){
a->arr[i].lchild = l;
a->arr[i].rchild = r;
}else{
a->arr[i].lchild = r;
a->arr[i].rchild = l;
}
}
printf("result:\n");
memset(&route,,sizeof(int)*MAXSIZE);
top = ;
traceTree(a,,sum,,);
}
return ;
}
void traceTree(treeArr *a,int id,int sum,int sum_tmp,int k){
if(id == - || sum_tmp+a->arr[id].num > sum)
return ;
int test_sum = sum_tmp+a->arr[id].num;
route[top++] = id;
if(test_sum == sum && a->arr[id].lchild==- && a->arr[id].rchild==- ){
printf("A path is found:");
int i;
for(i=;i<top;i++)
printf(" %d", route[i] );
printf("\n");
}
traceTree(a,a->arr[id].lchild,sum,test_sum,k+);
top = k;
traceTree(a,a->arr[id].rchild,sum,test_sum,k+);
}
/**************************************************************
Problem: 1368
User: xhalo
Language: C
Result: Accepted
Time:40 ms
Memory:3296 kb
****************************************************************/
剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)的更多相关文章
- 剑指Offer:二叉树中和为某一值的路径【34】
剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...
- 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径
剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...
- 剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...
- 【剑指Offer】二叉树中和为某一值的路径 解题报告(Python)
[剑指Offer]二叉树中和为某一值的路径 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...
- 【剑指offer】二叉树中和为某一值的路径
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26141815 题目描写叙述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数 ...
- 【Java】 剑指offer(34) 二叉树中和为某一值的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有 ...
- Go语言实现:【剑指offer】二叉树中和为某一值的路径
该题目来源于牛客网<剑指offer>专题. 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路 ...
- 《剑指offer》二叉树中和为某一值的路径
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 【剑指offer】二叉树中和为某一值的路径,C++实现
原创文章,转载请注明出处! 博客文章索引地址 1.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径由结点和有向边组成,从根结点到叶节点. // 二叉树结点的定义 st ...
随机推荐
- JavaScript代码调试
怎么在浏览器中调试JavaScript代码呢?首先,你需要安装Google Chrome浏览器,Chrome浏览器对开发者非常友好,可以让你方便地调试JavaScript代码.安装后,随便打开一个网页 ...
- POJ1159——Palindrome(最长公共子序列+滚动数组)
Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from ...
- Android tab_Host页面跳转,传值,刷新等问题汇总
之前做了一个项目是关于Tab_Host的,现在完成了恰逢闲余写份总结,主要涉及里面遇到问题以及解决方案的. (首先说明这份代码是在eoe 下载的,这里感谢分享的那位朋友,限于我的工程是公司的不能拿出来 ...
- WPF控件模板和数据模板
来自:http://www.th7.cn/Program/WPF/2011/12/21/51676.shtml ControlTemplate用于描述控件本身. 使用TemplateBinding来绑 ...
- C中如何调用C++函数、类内函数 \混编\链接
在C中如何调用C++函数的问题,简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂 ...
- Rabbitmq中rabbitmqctl的常用命令
学习rabbitmq,原理之后第一个要掌握的就是rabbitmqctl这个命令的用法了,rabbitmq的管理功能最全的就是rabbitmqctl命令了,当然还有HTTP API和UI两种管理手段. ...
- 【HDOJ】3386 Final Kichiku “Lanlanshu”
数位DP.需要注意的是需要特殊处理前导0,另外连续的==匹配,不要计重了,尽量贪心的匹配掉. /* 3886 */ #include <iostream> #include <sst ...
- oracle时间加减的语句写法
FROM: http://soft.doit.com.cn/article/2012/0105/2850851.shtml --加法 --加1年 SELECT SYSDATE,ADD_MONTHS( ...
- Android-xUtils框架介绍(四)
今天介绍xUtils的最后一个模块——HttpUtils,拖了那么久,终于要结束了.另外,码字不易,如果大家有什么疑问和见解,欢迎大家留言讨论.HttpUtils是解决日常工作过程中繁杂的上传下载文件 ...
- 实现类似QQ的即时通信程序(十一)
此为网络编程的一个系列,后续会把内容补上....