问题 F: 二叉树遍历
时间限制: 1 Sec 内存限制: 128 MB提交: 160 解决: 53
[ 提交][ 状态][ 讨论版]
题目描述
对于二叉树T,可以有先序遍历、中序遍历和后序遍历三种遍历方式。我们知道,任意给定一颗二叉树的两种遍历方式,就可以唯一确定该树。现在我们要求给出一棵二叉树的先序遍历序列和中序遍历序列,输出它的广度优先遍历序列。
输入
第一行为一个整数t(0<t<10),表示测试用例个数。 以下t行,每行输入一个测试用例,包含两个字符序列s1和s2,其中s1为一棵二叉树的先序遍历序列,s2为中序遍历序列。s1和s2之间用一个空格分 隔。序列只包含大写字母,并且每个字母最多只会出现一次。
输出
为每个测试用例单独一行输出广度优先遍历序列。
样例输入
2
DBACEGF ABCDEFG
BCAD CBAD
样例输出
DBEACGF
BCAD
提示
本题主要测试对二叉树遍历的理解.
#include<stdio.h>
#include<string.h>
char c1[100],c2[100];
int num[100],stack[100],flag[100];
int d,base,top;
void bfs()
{
int i,tmp;
base=0,top=0;
stack[base]=0;
flag[0]=1;
while(base<=top)
{
tmp=stack[base];
i=tmp;
while(i<d )
{
if(num[i]<num[tmp] && !flag[i])
{
stack[++top]=i;
flag[i]=1;
break;
}
i++;
}
i=tmp;
while(i<d)
{
if(num[i]>num[tmp] && !flag[i])
{
stack[++top]=i;
flag[i]=1;
break;
}
i++;
}
base++;
}
}
int main(void)
{
int t,i,j;
// freopen("d:\\in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%s%s",c1,c2);
d=strlen(c1);
i=0;
while(i<d)
{
j=0;
while(j<d)
{
if(c1[i]==c2[j])
{
num[i]=j;
break;
}
j++;
}
i++;
}
memset(flag,0,sizeof(flag));
bfs();
for(i=0;i<d;i++)
{
printf("%c",c1[stack[i]]);
}
printf("\n");
}
return 0;
}
/**************************************************************
Problem: 1070
Language: C
Result: Accepted
Time:0 ms
Memory:756 kb
****************************************************************/