题目描述:

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

输入:

每个测试案例包括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)的更多相关文章

  1. 剑指Offer:二叉树中和为某一值的路径【34】

    剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...

  2. 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径

    剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...

  3. 剑指 Offer 34. 二叉树中和为某一值的路径

    剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...

  4. 【剑指Offer】二叉树中和为某一值的路径 解题报告(Python)

    [剑指Offer]二叉树中和为某一值的路径 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  5. 【剑指offer】二叉树中和为某一值的路径

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26141815 题目描写叙述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数 ...

  6. 【Java】 剑指offer(34) 二叉树中和为某一值的路径

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有 ...

  7. Go语言实现:【剑指offer】二叉树中和为某一值的路径

    该题目来源于牛客网<剑指offer>专题. 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路 ...

  8. 《剑指offer》二叉树中和为某一值的路径

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  9. 【剑指offer】二叉树中和为某一值的路径,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 1.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径由结点和有向边组成,从根结点到叶节点. // 二叉树结点的定义 st ...

随机推荐

  1. SRM588

    250: 有n首歌每首歌有duration和tone,连续唱m首歌会消耗每首歌的duration以及相邻两首歌的tone的差的绝对值的和,给个T,问说在T时间内最对能唱多少歌. 将歌按tone排序后发 ...

  2. Sqlmap基础(二)

    sqlmap.py -r req1.txt --dbms Oracle --risk

  3. P151、面试题27:二叉搜索树与双向链表

    题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.(本质是中序遍历)二叉树结点的定义如下:struct BinaryTreeNod ...

  4. P137、面试题23:从上往下打印二叉树

    题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入如图的二叉树,则依次打印出8,6,10,5,7,9,11.(其实是按层遍历)二叉树结点的定义如下:struct Bin ...

  5. P127、面试题20:顺时针打印矩阵

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵:1  2  3  4 5  6  7  89  10  11  1213  14  15  16则依次打印出 ...

  6. node.js EventEmitter发送和接收事件

    EventEmitter是nodejs核心的一部分.很多nodejs对象继承自EventEmitter,用来处理事件,及回调.api文档地址: http://nodejs.org/api/events ...

  7. php简陋版实现微信公众号主动推送消息

    推荐一个网站www.itziy.com csdn免积分下载器.pudn免积分下载器.51cto免积分下载器www.verypan.com 百度网盘搜索引擎www.94cto.com 编程相关视频教程. ...

  8. Number of Rectangles in a Grid

    Project Euler 85: Investigating the number of rectangles in a rectangular grid Number of Rectangles ...

  9. ogg实现oracle到sql server 2005的同步

    一.源端(oracle)配置1.创建同步测试表create table gg_user.t01(name varchar(20) primary key);create table gg_user.t ...

  10. poj 3393 Lucky and Good Months by Gregorian Calendar(模拟)

    题目:http://poj.org/problem?id=3393一道题目挺长的模拟题,参考了网上大神的题解. #include <iostream> #include <cstdi ...