#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct tnode
{
char data;
tnode *lc,*rc;
}*tree;
void build(tree &t,char *he,char *mid,int len) //数组用字符来代替
{
if(len==0) t=NULL; //递归停止条件
else
{
int k=0;
int n=strlen(mid);
for(;k<n;k++) //寻找根节点
{
if(mid[k]==*he)
break;
}
t=new(tnode);
t->data=*he;
build(t->lc,he+1,mid,k); //t->lc; 递归左子树
build(t->rc,he+k+1,mid+k+1,len-(k+1)); //t->rc; 递归右子树
}
}
void last(tree &t) //后序遍历
{
if(t)
{
last(t->lc);
last(t->rc);
printf("%c",t->data);
}
}
typedef struct qnode //队节点
{
tree data;
qnode *next;
}*qtype;
typedef struct //队的定义
{
qtype front,rear;
}que;
void QueInitial(que &q) //队的初始化
{
q.front=q.rear=new(qnode);
q.front->next=NULL;
}
void InQue(que &q,tree &e) //队的插入
{
qtype p;
p=new(qnode);
p->data=e;
p->next=NULL;
q.rear->next=p;
q.rear=p;
}
char DelQue(que &q,tree &e)
{
qtype 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);
}
char QueEmpty(que &q)
{
if(q.front==q.rear) return 1;
else return 0;
}
void ceng(tree &t)
{
que q;
QueInitial(q);
if(t)
InQue(q,t);
while(!QueEmpty(q))
{
DelQue(q,t);
printf("%c",t->data);
if(t->lc)
InQue(q,t->lc);
if(t->rc)
InQue(q,t->rc);
}
}
int main()
{
int n;
char he[55],mid[55];
tree t;
scanf("%d",&n);
while(n--)
{
scanf("%s %s",he,mid);
int len=strlen(he);
build(t,he,mid,len);
last(t);
printf("\n");
ceng(t);
printf("\n");
}
return 0;
}
数据结构实验之求二叉树后序遍历和层次遍历
最新推荐文章于 2022-10-31 13:41:42 发布