数据结构实验之求二叉树后序遍历和层次遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。
输入
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。
输出
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列
示例输入
2 abdegcf dbgeafc xnliu lnixu
示例输出
dgebfca abcdefg linux xnuli
前序遍历也叫先序遍历。前序遍历有一个特点,第一个节点为二叉树的根节点,根据这个根节点可以在中序序列中找到根节点的左右子树。
例如:一个二叉树前序序列是:a b d e g c f,中序序列是:d b g e a f c,则根据前序序列第一个数据为a,在中序序列中可以看出此二叉树的
左子树为:d b g e ,右子树为:f c ,此时就可以用递归解决了,前序序列指针往后移动一个位置即为左子树的根节点,前序序列指针往后移动左子树节点个数加一个位置即为
右子树的根节点的位置。下面为具体的代码实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct node//此处不解释
{
char data;
struct node *lchild,*rchild;
}node,*nodeptr;
char xian[55],zhong[55];//定义两个全局数组
//xian[]为前序序列,zhong[]为中序序列
struct node *Creat(char *xian,char *zhong,int n)
{//根据前序遍历和中序遍历建立二叉树,n为二叉树包含节点个数
struct node *T;
int k;
char *p;
if(n<=0)return NULL;//当其包含结点数为0,返回
T=(struct node *)malloc(sizeof(struct node));
T->data=*xian;
for(p=zhong;p<zhong+n;p++)
{
if(*xian==*p)
break;
}
k=p-zhong;
T->lchild=Creat(xian+1,zhong,k);
T->rchild=Creat(xian+k+1,p+1,n-k-1);
return T;
}
int treelevel(struct node *T,int level)
{//层次遍历输出函数
if(!T||level<0)
return 0;
if(level==0)
{
printf("%c",T->data);
return 1;
}
return treelevel(T->lchild,level-1)+treelevel(T->rchild,level-1);
}
void level1(struct node *T)
{//二叉树层次控制函数
int i=0;
for(i=0;;i++)
{
if(!treelevel(T,i))
break;
}
}
void lrd(struct node *T)
{//后序遍历输出函数
if(T)
{
lrd(T->lchild);
lrd(T->rchild);
printf("%c",T->data);
}
}
int main()
{
int n,i;
struct node *T;
scanf("%d",&n);
while(n--)
{
scanf("%s",xian);
scanf("%s",zhong);
i=strlen(zhong);
T=Creat(xian,zhong,i);
lrd(T);
printf("\n");
level1(T);
printf("\n");
}
return 0;
}
下面为本人画出的前几步的运行步骤:
水平有限,不喜勿喷,原创辛苦,转载请注明出处*>_<*