数据结构实验之求二叉树后序遍历和层次遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。
输入
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。
输出
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列
示例输入
2 abdegcf dbgeafc xnliu lnixu
示例输出
dgebfca abcdefg linux xnuli
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char telemtype;
typedef char status;
typedef struct bitnode
{
telemtype data;
struct bitnode *lchild, *rchild;
}*bitree;
bitree BinaryTree(char* pre, char* ino, int length)//已知前序和中序
{
if(length == 0)//递归结束条件
{
return 0;
}
bitree t = new bitnode;
t->data = *pre;//前序序列的第一个元素即为根节点
int rootIndex = 0;
for(; rootIndex < length; rootIndex++)//找到根节点在中序序列中的位置,用以划分左右子树
{
if(ino[rootIndex] == *pre)
break;
}
//Left
t->lchild = BinaryTree( pre +1, ino, rootIndex);//对左子树重复上述操作
//Right
t->rchild = BinaryTree(pre + rootIndex + 1, ino + rootIndex + 1, length - (rootIndex + 1));//对右子树重复上述操作
//输出位置(求后序序列)
return t;
}
void postorder(bitree &t)
{
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%c", t->data);
}
}
typedef bitree qelemtype;
typedef struct qnode
{
qelemtype data;
qnode *next;
}*queueptr;
typedef struct
{
queueptr front;
queueptr rear;
} lq;
void initq(lq &q)
{
q.front = q.rear = (queueptr)malloc(sizeof(qnode));
if(!q.front) exit(0);
q.front -> next = NULL;
}
void enq(lq &q, qelemtype &e)
{
queueptr p;
p = (queueptr)malloc(sizeof(qnode));
if(!p) exit(0);
p->data = e;
p->next = NULL;
q.rear->next = p;
q.rear = p;
}
status outq(lq &q, qelemtype &e)
{
queueptr p;
if(q.front == q.rear)
return 0;
p = q.front->next;
e = p->data;
q.front->next = p->next;
if(q.rear == p)
q.rear = q.front;
free(p);
}
int emptyq(lq &q)
{
if(q.front == q.rear)
return 1;
else
return 0;
}
void traverse(bitree &t)
{
lq q;
bitree p;
p=t;
initq(q);
if(p)
enq(q, p);
while(!emptyq(q))
{
outq(q, p);
printf("%c", p->data);
if(p->lchild)
enq(q, p->lchild);
if(p->rchild)
enq(q, p->rchild);
}
}
int main()
{
char pre[55], ino[55];
int m;
scanf("%d", &m);
while(m--)
{
bitree t;
scanf("%s", pre);
scanf("%s", ino);
int length = strlen(pre);
t = BinaryTree(pre, ino, length);
//BinaryTree(t, pre, ino, 0, 0, length);
postorder(t);
printf("\n");
traverse(t);
printf("\n");
}
}