利用中序遍历和后序遍历构造二叉树,然后再按层序打印二叉树各节点
题目来源PAT_advanced 1020
https://www.patest.cn/contests/pat-a-practise/1020
直接po代码了
#include <cstdio>
#include <cstdlib>
#define MAX 1010
typedef struct Node
{
int data;
struct Node *lchild;
struct Node *rchild;
}Node;
void makeTree(Node *&t,int post[],int in[],int n)
{
if(n==0)
{
return;
}
int root = post[n-1];
t = (Node *)malloc(sizeof(Node));
t->data = root;
t->lchild=t->rchild=NULL;
int i;
for(i=0;i<n;i++)
{
if(root==*(in+i))
{
break;
}
}
makeTree(t->lchild,post,in,i);
makeTree(t->rchild,post+i,in+i+1,n-i-1);
}
void travel_level(Node *T)
{
Node *que[MAX];//定义顺序队列
int front,rear;
front=rear=-1;
Node *p=T;
if(p!=NULL)
{
rear++;
que[rear]=p;
}
while(front!=rear)
{
front++;
p=que[front];
if(p->lchild!=NULL)
{
rear++;
que[rear]=p->lchild;
}
if(p->rchild!=NULL)
{
rear++;
que[rear]=p->rchild;
}
}
if(rear!=-1)
{
printf("%d",que[0]->data);
}
for(int i=1;i<rear+1;i++)
{
printf(" %d",que[i]->data);
}
printf("\n");
}
void travel_pre(Node *T)//先序遍历二叉树
{
if(NULL==T)
{
return;
}
printf("\t%d",T->data);
travel_pre(T->lchild);
travel_pre(T->rchild);
}
void delete_tree(Node *T)
{
if(NULL==T)
{
return;
}
delete_tree(T->lchild);
delete_tree(T->rchild);
free(T);
}
int main()
{
int n;
int post[MAX],in[MAX];
int i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&post[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&in[i]);
}
Node *T=NULL;
makeTree(T,post,in,n);
//=========================
//travel_pre(T);
//printf("\n");
//=========================
travel_level(T);
delete_tree(T);
}
return 0;
}