您的位置:首页 > 其它

题目1368:二叉树中和为某一值的路径

2014-07-19 11:35 253 查看
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

输入:
每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。

代码一:dfs

#include<stdio.h>
#include<stdlib.h>
#define Max 10001

typedef struct tree
{
int data;
int left;
int right;
}Node;
Node *Atree[Max];

int getMin(int a,int b)
{
return (a <= b) ? a : b;
}

int getMax(int a,int b)
{
return (a >= b) ? a : b;
}

void create(Node *node[],int n)
{
int tmp,left,right;
for(int i = 1; i <= n; i++)
{
scanf("%d %d %d",&tmp,&left,&right);
int min = getMin(left,right);
int max = getMax(left,right);
node[i]->data = tmp;
node[i]->left = min;
node[i]->right = max;
}
}

int top = -1;
int path[Max];
void findPath(int id ,int sum,int k)
{
if(id == -1)
return;
sum += Atree[id]->data;
top++;
path[top] = id;
if(sum == k && (Atree[id]->left == -1 && Atree[id]->right == -1))
{
printf("A path is found:");
for(int i = 0; i <=top; i++)
printf(" %d",path[i]);
printf("\n");
return;
}
findPath(Atree[id]->left,sum,k);
if(Atree[id]->left) 	top--;
findPath(Atree[id]->right,sum,k);
if(Atree[id]->right)	top--;
}

int Sum = 0;
void findPath1(int id, int k)
{
Node *node = Atree[id];
if(id == 1)
{
Sum = 0;
while(top != -1)
top--;
}
if(node->data + Sum == k && node->left == -1 && node->right == -1)
{
printf("A path is found:");
for(int i = 0; i <=top; i++)
printf(" %d",path[i]);
printf(" %d\n",id);
return;
}
else
{
Sum += node->data;
top++;
path[top] = id;
if(node->left != -1 && node->right == -1)
findPath1(node->left,k);
else if(node->right != -1 && node->left == -1)
findPath1(node->right,k);
else if(node->right != -1 && node->right != -1)
{
findPath1(node->left,k);
findPath1(node->right,k);
}
top--;
Sum -= node->data;
}
}

int main()
{
int n,k;
while(scanf("%d %d",&n,&k) != EOF)
{
int a[n + 1];
for(int i = 1; i <= n; i++)
Atree[i] = new Node;
create(Atree,n);
printf("result:\n");
findPath1(1,k);
//清空
for(int i = 1;i <= n;i++)
{
delete Atree[i];
Atree[i]=NULL;
}
top = -1;
Sum = 0;
}
}


代码二:

#include<stdio.h>
#include<stdlib.h>
#define Max 10001

typedef struct tree
{
int mark;//节点的编号
int data;
struct tree *left;
struct tree *right;
int num; //节点的父节点
}Node;
Node *Atree[Max];

int getMin(int a,int b)
{
return (a < b) ? a : b;
}

int getMax(int a,int b)
{
return (a > b) ? a : b;
}

int p = 0;
int path[Max];
void create(Node *node[],int n)
{
int tmp,left,right;
for(int i = 1; i <= n; i++)
{
scanf("%d %d %d",&tmp,&left,&right);
int min = getMin(left,right);
int max = getMax(left,right);
node[i]->mark = i;
node[i]->data = tmp;
if(min != -1 && max != -1)
{
node[i]->left = node[min];
node[i]->right = node[max];
node[min]->num = i;
node[max]->num = i;
}
else if(min == -1 && max != -1)
{
node[i]->left = NULL;
node[i]->right = node[max];
node[max]->num = i;
}
else if(min != -1 && right == -1)
{
node[i]->left = node[min];
node[i]->right = NULL;
node[min]->num = i;
}
else
{
node[i]->left = NULL;
node[i]->right = NULL;
}
}
}

void getChild(Node *root)
{
if(root->left == NULL && root->right == NULL)
{
path[p] = root->mark;
p++;
return;
}
else if(root->left != NULL && root->right != NULL)
{
getChild(root->left);
getChild(root->right);
}
else if(root->left != NULL)
{
getChild(root->left);
}
else
getChild(root->right);
}

void PrintPath(int n)
{
if(Atree
!= NULL)
{
PrintPath(Atree
->num);
printf(" %d",Atree
->mark);
}
}

int main()
{
int n,k;
while(scanf("%d %d",&n,&k) != EOF)
{
int a[n + 1];
for(int i = 1; i <= n; i++)
{
Atree[i] = new Node;
Atree[i]->num = 0;
}
create(Atree,n);
getChild(Atree[1]);
printf("result:\n");
for(int i = 0; i < p; i++)
{
int sum = 0;
int j = path[i];
while(Atree[j] != NULL)
{
sum += Atree[j]->data;
j = Atree[j]->num;
}
if(sum == k)
{
printf("A path is found:");
PrintPath(path[i]);
printf("\n");
}
}
//清空
for(int i = 1;i <= n;i++)
{
delete Atree[i];
Atree[i]=NULL;
}
p = 0;
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: