给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:7 1 2 3 4 5 6 7 4 1 3 2 6 5 7输出样例:
4 6 1 7 5 3 2
#include<stdio.h>
#include<malloc.h>
struct node{
int data;
struct node *l;
struct node *r;
};
struct node *create(int a[],int b[],int l1,int r1,int l2,int r2){
struct node *T;
int i,mid,len1,len2;
if(l1>r1)return NULL;
T=(struct node*)malloc(sizeof(struct node));
for(i=l2;i<=r2;i++)
{
if(b[i]==a[l1]){
mid=i;
break;
}
}
len1=mid-l2;
len2=r2-mid;
T->data=a[l1];
T->l=create(a,b,l1+1,l1+1+len1-1,l2,l2+len1-1);
T->r=create(a,b,r1-len2+1,r1,r2-len2+1,r2);
return T;
}
struct node *transfer(struct node *T){
struct node *T2;
if(T==NULL)return NULL;
T2=(struct node*)malloc(sizeof(struct node));
T2->data=T->data;
T2->l=transfer(T->r);
T2->r=transfer(T->l);
return T2;
}
int main()
{
int a[50];
int b[50];
int c[50];
int n,i,head,tail,p;
struct node *root,*temp;
struct node *que[50];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
root=create(b,a,0,n-1,0,n-1);
root=transfer(root);
head=tail=0;
p=-1;
que[tail++]=root;
while(tail>head){
temp=que[head++];
c[++p]=temp->data;
if(temp->l)
que[tail++]=temp->l;
if(temp->r)
que[tail++]=temp->r;
}
for(i=0;i<p;i++)
printf("%d ",c[i]);
printf("%d\n",c[i]);
}