题目1368:二叉树中和为某一值的路径-九度
2013-08-20 16:36
267 查看
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入:
每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
样例输入:
5 22
10 2 3
5 4 5
12 -1 -1
4 -1 -1
7 -1 -1
1 5
1 -1 -1
样例输出:
result:
A path is found: 1 2 5
A path is found: 1 3
result:
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1368
这与PAT的http://blog.csdn.net/zhu_liangwei/article/details/9735741类似。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
typedef struct node{
int val;
int left;
int right;
}node;
vector<int> path;
void print_path(){
printf("A path is found:");
for(int i=0;i<path.size();i++){
printf(" %d",path[i]);
}
printf("\n");
}
void find_fit_path(int curr,int i,const node *t){
if(i!=-1&&t[i].val==curr&&-1==t[i].left&&-1==t[i].right){
path.push_back(i);
print_path();
path.pop_back();
}
else if(t[i].val<curr){
int tmp=min(t[i].left,t[i].right);
path.push_back(i);
if(tmp!=-1)
find_fit_path(curr-t[i].val,tmp,t);
tmp=max(t[i].left,t[i].right);
if(tmp!=-1)
find_fit_path(curr-t[i].val,tmp,t);
path.pop_back();
}
}
int main()
{
int n,k,i;
while(scanf("%d%d",&n,&k)!=EOF){
node *tree=new node[n+1];
for(i=1;i<=n;i++)
scanf("%d%d%d",&tree[i].val,&tree[i].left,&tree[i].right);
printf("result:\n");
find_fit_path(k,1,tree);
}
}
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入:
每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
样例输入:
5 22
10 2 3
5 4 5
12 -1 -1
4 -1 -1
7 -1 -1
1 5
1 -1 -1
样例输出:
result:
A path is found: 1 2 5
A path is found: 1 3
result:
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1368
这与PAT的http://blog.csdn.net/zhu_liangwei/article/details/9735741类似。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
typedef struct node{
int val;
int left;
int right;
}node;
vector<int> path;
void print_path(){
printf("A path is found:");
for(int i=0;i<path.size();i++){
printf(" %d",path[i]);
}
printf("\n");
}
void find_fit_path(int curr,int i,const node *t){
if(i!=-1&&t[i].val==curr&&-1==t[i].left&&-1==t[i].right){
path.push_back(i);
print_path();
path.pop_back();
}
else if(t[i].val<curr){
int tmp=min(t[i].left,t[i].right);
path.push_back(i);
if(tmp!=-1)
find_fit_path(curr-t[i].val,tmp,t);
tmp=max(t[i].left,t[i].right);
if(tmp!=-1)
find_fit_path(curr-t[i].val,tmp,t);
path.pop_back();
}
}
int main()
{
int n,k,i;
while(scanf("%d%d",&n,&k)!=EOF){
node *tree=new node[n+1];
for(i=1;i<=n;i++)
scanf("%d%d%d",&tree[i].val,&tree[i].left,&tree[i].right);
printf("result:\n");
find_fit_path(k,1,tree);
}
}
相关文章推荐
- 九度 题目1368:二叉树中和为某一值的路径
- 九度 题目1368:二叉树中和为某一值的路径
- 九度 题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- *【九度OJ1368】|【剑指offer25】二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
- 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ
- 题目1368:二叉树中和为某一值的路径
- 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ
- 题目1368:二叉树中和为某一值的路径
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
- 九度OJ-题目1368:二叉树中和为某一值的路径
- 程序员面试题目总结--树(一)【重建二叉树、二叉树的深度、树的子结构、二叉树中和为某一值得路径、从上往下打印二叉树】
- 1368:二叉树中和为某一值的路径 @jobdu
- 剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
- JD 1368:二叉树中和为某一值的路径