您的位置:首页 > 其它

题目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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: