您的位置:首页 > 理论基础 > 数据结构算法

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

2018-02-27 21:23 330 查看

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

Time Limit: 1000 ms Memory Limit: 65536 KiB [align=center]Submit Statistic Discuss [/align]

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