剑指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 ...
随机推荐
- Android安全问题 钓鱼程序
导读:文本介绍一种钓鱼应用,讲述如何骗取用户的用户名和密码,无须root 这个话题是继续android安全问题(二) 程序锁延伸的 之前我已经展示了如何制作程序锁.当打开指定应用的时候,弹出一个密码页 ...
- 安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端
学校使用的是Inode客户端认证上网的.如果是使用Ubuntu 32位版本,可以完美地安装并能够连接到网站.但是如果安装的是Ubuntu desktop 12.10 amd64版本,则发现之前的&qu ...
- (从终端看linux-1)linux tty pty pts 概念 区别
基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东 ...
- open/write/read
C语言中open函数 作用:打开和创建文件. 简述: 1 2 3 4 #include <fcntl.h> int open(const char *pathname, int flags ...
- 转:Bitbucket使用方法
一.软件及SSH keys: 由于我的Bitbucket账号的邮箱及用户名与Github相同,所以SSH Public Keys可以用Github的,登录Bitbucket,悬浮在用户名boliqua ...
- 为Windows 7添加“Internet打印”功能
http://wangchunhai.blog.51cto.com/225186/1156589/
- How to install GSL on linux(ubuntu,centos,redhat)
Test: ftp://ftp.gnu.org/gnu/gsl/gsl-1.15.tar.gz success. ftp://ftp.gnu.org/gnu/gsl/gsl-1.13.0.tar.g ...
- MySQL优化器 limit影响的case
测试的用例中,因为limit的大小不同,而产生了完全不同的执行计划: 1. 测试case: create table t1 ( f1 ) not null, f2 ) not null, f3 ) n ...
- 【express】
app.use(express.favicon(__dirname + '/public/images/favicon.ico'));不支持png格式
- 上传文件出错:org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
最近做一个web项目中有上传文件的功能,已经写出并在本地和部署到服务器上测试了好几个文件上传都没问题(我用的是tomcat).后来又上传了一个700多K的文件(前边的都是不足600K的,并且这个wor ...