题目描述:

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

输入:

每个测试案例包括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. ActiveMQ可靠性机制

    消息的签收(Acknowledgment): 客户端成功接收一条消息的标志是这条消息被签收. 成功接收一条消息一般包括如下三个阶段: (1) 客户端接收消息  (2) 客户端处理消息   (3) 消息 ...

  2. android下升级软件介绍

    编译android: 生成:system.img,ramdisk.img,userdata.img映像文件. ramdisk.img是emulator的文件系统 system.img包括了主要的包.库 ...

  3. html树形菜单控件

    html树形菜单控件  链接 http://www.ithao123.cn/content-713974.html         jQuery plugin: Treeview  这个插件能够把无序 ...

  4. You must supply a layout_width attribute的错误原因及解决办法

    学习android的过程中,尝试新功能,结果出现了这个一个error: 05-21 15:38:52.745: E/AndroidRuntime(17608): java.lang.RuntimeEx ...

  5. 中国VR公司的详尽名单

    中国VR公司的详尽名单   <VR圈深度投资报告一:2014年以来所有VR/AR融资事件> 特征一.投资机构观望居多 尽管VR在媒体和二级市场炒得很热,但大多风险投资机构却慎于出手,以观望 ...

  6. poj 1125 Stockbroker Grapevine(最短路 简单 floyd)

    题目:http://poj.org/problem?id=1125 题意:给出一个社交网络,每个人有几个别人可以传播谣言,传播谣言需要时间.问要使得谣言传播的最快,应该从那个人开始传播谣言以及使得所有 ...

  7. Innodb 锁系列2 事务锁

    上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...

  8. .NET下文本相似度算法余弦定理和SimHash浅析及应用

    余弦相似性 原理:首先我们先把两段文本分词,列出来所有单词,其次我们计算每个词语的词频,最后把词语转换为向量,这样我们就只需要计算两个向量的相似程度.   我们简单表述如下   文本1:我/爱/北京/ ...

  9. I.MX6 Android i2c-tools porting

    /************************************************************************** * I.MX6 Android i2c-tool ...

  10. Welcome to Linux From Scratch!

    /**************************************************************************** * Welcome to Linux Fro ...