题目描述:

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

输入:

每个测试案例包括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. 213. House Robber II

    题目: Note: This is an extension of House Robber. After robbing those houses on that street, the thief ...

  2. Windbg:如何给字符串下条件断点

    因为Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp.用法和c中的字符串比较方法一致.在需要比较字符串成员变量的时候,遇到了点问题.因为字符串成员变量无法直接获取字符串内容.p ...

  3. ASCII码表详解

    第一部分:ASCII非打印控制字符表 ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备.例如,12代表换页/新页功能.此命令指示打印机跳到下一页的开头.(参详ASCII码表 ...

  4. 【HDOJ】2388 Playground Hideout

    优先级队列直接AC. /* 2388 */ #include <iostream> #include <sstream> #include <string> #in ...

  5. android 自动调整屏幕分辨率

    请看 http://blog.csdn.net/awp258/article/details/7593340

  6. bzoj1001

    平面图求最小割: 其实看bzoj1001一开始着实把我怔住了 AC的人暴多,可自己完全没思路 后来看了某大牛的ppt,才会做 一个月前做这题的吧,今天来简单回忆一下: 首先是欧拉公式 如果一个连通的平 ...

  7. uva753 A Plug for UNIX

    最大流. 流可以对应一种分配方式. 显然最大流就可以表示最多匹配数 #include<cstdio> #include<algorithm> #include<cstri ...

  8. CPU affinity 进程和线程的亲缘性

    设置Processor Affinity 作用: 1.进程和线程的亲缘性(affinity),使进程或线程在指定的CPU(核)上运行.(比如程序A,在第4个核心上运行) 2.设置进程 或者 线程, 使 ...

  9. C# DataGridView绑定数据源的几种常见方式

    开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1. 简单的数据绑定 例1 using (SqlConnection conn = new SqlConnect ...

  10. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.3.6

    If $A$ is a contraction, show that $$\bex A^*(I-AA^*)^{1/2}=(I-A^*A)^{1/2}A^*. \eex$$ Use this to sh ...