数据结构实验之求二叉树后序遍历和层次遍历
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。
Input
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。
Output
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列。
Sample Input
2 abdegcf dbgeafc xnliu lnixu
Sample Output
dgebfca abcdefg linux xnuli
Hint
Source
ma6174
解题思路:数据结构书面考试常见题型,用代码实现起来有一点难度,不过也很好理解,基本思路就是递归。
AC代码:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef char elem;
typedef struct node
{
elem date;
struct node *lchild;
struct node *rchild;
}BiTree;
BiTree * createTree(elem pre[55], elem mid[55], int len) ///先序中序建立树
{
if(len == 0)
{
return NULL;
}
char *p;
BiTree *root;
root = (BiTree *)malloc(sizeof(BiTree));
root->date = pre[0];
for(p = mid; p != '\0'; p++)
{
if(*p == pre[0])
{
break;
}
}
int t;
t = p - mid;
root->lchild = createTree(pre+1,mid,t);
root->rchild = createTree(pre+1+t,p+1,len-t-1);
return root;
}
void post_treverse(BiTree *root) ///后序遍历
{
if(root != NULL)
{
post_treverse(root->lchild);
post_treverse(root->rchild);
printf("%c",root->date);
}
}
void level_treverse(BiTree *root) ///层序遍历
{
BiTree *q[55];
int fro, rear;
fro = 0;
rear = 0;
q[rear++] = root;
while(fro < rear)
{
if(q[fro])
{
printf("%c", q[fro]->date);
q[rear++] = q[fro]->lchild;
q[rear++] = q[fro]->rchild;
}
fro++;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
BiTree *root;
int len;
//root = (BiTree *)malloc(sizeof(BiTree));
char pre[55], mid[55];
scanf("%s %s",pre, mid);
len = strlen(pre);
root = createTree(pre,mid,len);
post_treverse(root);
printf("\n");
level_treverse(root);
printf("\n");
}
return 0;
}