题目
已知二叉树的先序序列和中序序列或中序序列和后序序列,创建二叉树
思路
先序序列和后序序列可以找到根节点(先序序列根节点在最前面,后序在最后面),然后可以通过中序序列将二叉树分为左子树和右子树,然后根据左子树的节点个数和右子树的节点个数可以得到在先序序列和后序序列中左右子树的根节点,由此递推,可以得到完整的二叉树。
代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10000
typedef struct tree {
int data;
struct tree*left;
struct tree*right;
}Tree;
void createTree(Tree**t,int *a,int *b,int l1,int r1,int l2,int r2);//先序中序遍历二叉树
void rearPrint(Tree *t); //后序遍历二叉树
Tree* createTree1(int *a,int *b,int root,int left,int right); //中序后序创建二叉树
void prePrint(Tree *t); //先序遍历二叉树
void LayerOrder(Tree *t); //层序遍历二叉树
int main()
{
int a[MAXSIZE]={0},b[MAXSIZE]={0};
int len=0;
Tree *tree;
printf("请输入先序序列和中序序列的长度:") ;
scanf("%d",&len);
printf("请输入先序序列:") ;
for(int i=0;i<len;i++){
scanf("%d",&a[i]);
}
printf("请输入中序序列:") ;
for(int i=0;i<len;i++){
scanf("%d",&b[i]);
}
createTree(&tree,a,b,0,len-1,0,len-1);
printf("后序遍历二叉树:") ;
rearPrint(tree);
printf("\n");
printf("层序遍历二叉树:") ;
LayerOrder(tree);
printf("\n");
printf("请输入中序序列和后序序列的长度:") ;
scanf("%d",&len);
printf("请输入中序序列:") ;
for(int i=0;i<len;i++){
scanf("%d",&a[i]);
}
printf("请输入后序序列:") ;
for(int i=0;i<len;i++){
scanf("%d",&b[i]);
}
tree=createTree1(a,b,len-1,0,len-1);
printf("先序遍历二叉树:") ;
prePrint(tree);
printf("\n");
printf("层序遍历二叉树:") ;
LayerOrder(tree);
}
void createTree(Tree**t,int *a,int *b,int l1,int r1,int l2,int r2) //先序中序创建二叉树
{
(*t)=(Tree*)malloc(sizeof(Tree));
(*t)->data=a[l1];
int root=0;
for(root=l2;root<=r2;root++){
if(a[l1]==b[root]){
break;
}
}
if(root-l2!=0){
createTree(&(*t)->left,a,b,l1+1,l1+root,l2,root-1);
}else{
(*t)->left=NULL;
}
if(root-r2!=0){
createTree(&(*t)->right,a,b,r1-(r2-root)+1,r1,root+1,r2);
}else{
(*t)->right=NULL;
}
}
Tree* createTree1(int *a,int *b,int root,int left,int right) //中序后序创建二叉树
{
if(left>right){
return NULL;
}
Tree *t=(Tree*)malloc(sizeof(Tree));
t->data=b[root];
int i;
for(i=left;i<=right;i++)
{
if(b[root]==a[i]) break;
}
t->left=createTree1(a,b,root-(right-i)-1,left,i-1);
t->right=createTree1(a,b,root-1,i+1,right);
return t;
}
void rearPrint(Tree *t) //后序遍历二叉树
{
if(!t){
return;
}
rearPrint(t->left);
rearPrint(t->right);
printf("%d ",t->data);
}
void prePrint(Tree *t) //先序遍历二叉树
{
if(!t){
return;
}
printf("%d ",t->data);
prePrint(t->left);
prePrint(t->right);
}
void LayerOrder(Tree *t) //层序遍历二叉树
{
if(!t) return;
int start=-1,end=0,flag=0;
Tree *p[MAXSIZE];
p[end]=t;
while(start!=end){
start++;
if(flag){
printf(" ");
}
printf("%d",p[start]->data);
flag=1;
if (p[start]->left) {
end++;
p[end] = p[start]->left;
}
if (p[start]->right) {
end++;
p[end] = p[start]->right;
}
}
}