SDUT-2137数据结构实验之求二叉树后序遍历和层次遍历

数据结构实验之求二叉树后序遍历和层次遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。

输入

 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。

输出

每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列

示例输入

2
abdegcf
dbgeafc
xnliu
lnixu

示例输出

dgebfca
abcdefg
linux
xnuli
探索了解钻研的过程是痛苦的 结果是享受的
View Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct tree
{
char data ;
struct tree *l,*r;
}st;
st *creat(char *or,char *in,int k)
{
st *t;
if(k<=0)
return NULL ;
char *p;
int m ;
t = (st *)malloc(sizeof(st));
t->data = *or;//树根节点一定是先序的第一个
for(p = in ; p!=NULL ; p++)//找到根节点
if(*p == *or)
break;
m = p-in;//确定左子树的长度
t->l = creat(or+1,in,m) ;//找到一个根节点后先序下移一个 找下一个的子树根节点
t->r = creat(or+m+1,p+1,k-m-1);//类似的找右子树
return t;
}
void posorder(st *t)
{
if(t)
{
posorder(t->l);
posorder(t->r);
printf("%c",t->data);
}
}
void lorder(st *t)
{
int rear = 1,front = 0;
st *p[52];
p[0] = t;
while(rear>front)//这里在纸上画下一个队列就可以看出来
{
if(p[front])
{
printf("%c",p[front]->data);
p[rear++] = p[front]->l;//将左节点存在队列中
p[rear++] = p[front]->r;//将有节点存在队列中
front++;
}
else
front++;
}
}
int main()
{
int n,k;
char or[52],in[52] ;
st *t ;
t = (st *)malloc(sizeof(st));
scanf("%d%*c", &n);
while(n--)
{
scanf("%s%s", or,in);
k = strlen(or);
t = creat(or,in,k);
posorder(t);//后序遍历
puts("");
lorder(t);//层次遍历
puts("");
}
return 0;
}
posted @ 2012-03-03 16:19  _雨  阅读(1652)  评论(3编辑  收藏  举报