简单利用树的先序和中序构造二叉树。
#include<stdio.h>
#include<stdlib.h>
typedef int element_type;
typedef struct node
{
element_type data;
struct node *Lson,*Rson;
}node,*ptr;
ptr creat1(element_type a[],element_type b[],int i,int j,int s,int t)
{
int k;
ptr p;
if(i>j) return NULL;
p=(ptr)malloc(sizeof(node));
p->data=a[i];
k=s;
while((k<=t)&&(b[k]!=a[i])) k++;
if(b[k]!=a[i]) exit(0);
p->Lson=creat1(a,b,i+1,i+k-s,s,k-1);
p->Rson=creat1(a,b,i+k-s+1,j,k+1,t);
return p;
}
void preorder_1(ptr p)//先序遍历
{
printf("%d ",p->data);
if(p->Lson!=NULL) preorder_1(p->Lson);
if(p->Rson!=NULL) preorder_1(p->Rson);
}
void preorder_2(ptr p)//中序遍历
{
if(p->Lson!=NULL) preorder_2(p->Lson);
printf("%d ",p->data);
if(p->Rson!=NULL) preorder_2(p->Rson);
}
void preorder_3(ptr p)//后序遍历
{
if(p->Lson!=NULL) preorder_3(p->Lson);
if(p->Rson!=NULL) preorder_3(p->Rson);
printf("%d ",p->data);
}
void preorder_4(ptr p)//层序遍历
{
if(p==NULL) return;
int front=-1,rear=0;
ptr queue[100];
queue[rear]=p;
while(front!=rear)
{
front++;
printf("%d ",queue[front]->data);
if(queue[front]->Lson!=NULL)
{
rear++;
queue[rear]=queue[front]->Lson;
}
if(queue[front]->Rson!=NULL)
{
rear++;
queue[rear]=queue[front]->Rson;
}
}
}
int main()
{
ptr root;
element_type a[100],b[100];
int N,i=0,j=0,s=0,t=0;
printf("请输入树的结点数:");
scanf("%d",&N);
printf("请输入树的先序序列:");
for(;j<N;j++)
scanf("%d",&a[j]);
printf("请输入树的中序序列:");
for(;t<N;t++)
scanf("%d",&b[t]);
root=creat1(a,b,i,j-1,s,t-1);
printf("树的先序序列:");
preorder_1(root);
printf("\n");
printf("树的中序序列:");
preorder_2(root);
printf("\n");
printf("树的后序序列:");
preorder_3(root);
printf("\n");
printf("树的层序序列:");
preorder_4(root);
}