本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
代码:
//思路:将中序遍历的数储存下来,由后序遍历的顺序找到他们的前后关系,即后序遍历在后面的数为根或者右兄弟,然后由每棵树(包括子树)的根,将中序遍历的数据分成两部分,进行递归
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkStack
{
struct LinkStack *next;
ElemType data;
} LinkStack,*Linkstack;
typedef struct BiTree
{
struct BiTree *lchild,*rchild;
// struct BinTree;
int data;
} BTNode,*Bitree;
typedef struct NumList
{
int data; //储存的值
int n; //在后序中的次序
} NumList;
int InitList(NumList s[],int p)
{
int mm[p+2];
int a;
for(int i=0;i<p;i++)
{
scanf("%d",&a);
mm[a]=i;
}
for(int i=0;i<p;i++)
{
scanf("%d",&a);
s[i].data=a;
s[i].n=mm[a];
}
}
int Findmax(NumList *s,int p,int q)
{
int ma=0;
int y=0;
// printf("寻找函数p,q:%d %d\n",p,q);
for(int i=p;i<q;i++)
{
if(s[i].n>=ma)
{
ma=s[i].n;
y=i;
}
}
//printf("寻找函数输出y:%d\n",y);
// printf("222\n");
// printf("%d\n",y);
return y;
}
int Tree(Bitree t,NumList *m,int p,int q) //左闭右开
{
if(p==q)
return 0;
else
{
int d;
int f;
d=Findmax(m,p,q);
//printf("%d ",d);
// printf("%d\n",m[d].data);
//t->data
f=m[d].data;
t->data=f;
// printf("%d %d 666\n",p,q);
// printf("333%d %d\n",t->data,d);
if(d!=p)
{
t->lchild=(Bitree)malloc(sizeof(BTNode));
t->lchild->lchild=NULL;
t->lchild->rchild=NULL;
}
else
{
t->lchild=NULL;
// printf("我是叶子%d ,我左浮空\n",t->data);
}
if(d!=q-1)
{
t->rchild=(Bitree)malloc(sizeof(BTNode));
t->rchild->rchild=NULL;
t->rchild->lchild=NULL;
}
else
{
t->rchild=NULL;
// printf("我是叶子%d ,我右浮空\n",t->data);
}
Tree(t->lchild,m,p,d);
Tree(t->rchild,m,d+1,q);
}
}
int Print(Bitree t)
{
static int mff=0;
// printf(" %d",t->data);
if(!t)
{
return 0;
}
else
{
if(mff==0)
{
printf("%d",t->data);
mff++;
}
else
printf(" %d",t->data);
Print(t->lchild);
Print(t->rchild);
}
}
int main()
{
int mf;
scanf("%d",&mf);
Bitree t;
t=(Bitree)malloc(sizeof(BTNode));
//t->data=2;
// printf("11 %d\n",t->data);
NumList m[mf+2];
InitList(m,mf);
// for(int i=0;i<mf;i++)
// {
// printf(" %d",m[i].n);
// }
// printf("111\n");
Tree(t,m,0,mf);
printf("Preorder: ");
Print(t);
}