树-由先序和中序序列求后序序列

Q:给定一棵二叉树的前序遍历和中序遍历,求其后序遍历。

输入:两个字符串,一行为前序遍历,第二行为中序遍历

样例:import:abc bac output:bca

代码:

#include<stdio.h>

#include<string.h>

 

struct Node

{

       Node *lchild;

       Node *rchild;

       char c;

}Tree[50];//构建树的结点结构,此处用静态数组。

 

int loc;//静态空间中已使用结点个数

char str1[50];

char str2[50];

 

void postorder(Node *T)//后序遍历函数

{

       if(T->lchild!=NULL)

       {

       postorder(T->lchild);

       }

    if(T->rchild!=NULL)

       {

              postorder(T->rchild);

       }

       printf("%c",T->c);

}//

Node *creat()//结点定义及初始化

{

       Tree[loc].lchild=Tree[loc].rchild=NULL;//**************注意此处不是指针,不要将'.'与'->'混淆,后者是用于指针。

       return &Tree[loc++];

}

 

Node *build(int s1,int e1,int s2,int e2) //根据前序遍历,中序遍历来构建二叉树

{

 

       Node *t=creat();

       int m;

       t->c=str1[s1];

       for(int i=s2;i<=e2;i++)

       {

              if(str2[i]==t->c)

              {

                     m=i;

                     break;

              }

       }

       if(m!=s2)

       {

              t->lchild=build(s1+1,s1+m-s2,s2,m-1);

       }

       if(m!=e2)

       {

              t->rchild=build(s1+m-s2+1,e1,m+1,e2);

       }

       return t;

}

 

 

int main()

{

while(scanf("%s%s",str1,str2)!=EOF)

{

       int loc=0;

       Node *T=build(0,strlen(str1)-1,0,strlen(str2)-1);

       postorder(T);

}

return 0;

}

 

posted @ 2013-04-01 11:00  Light_yagami  阅读(217)  评论(0)    收藏  举报