zoukankan      html  css  js  c++  java
  • swust oj 984

    利用二叉树中序及先序遍历确定该二叉树的后序序列

    1000(ms)
    10000(kb)
    2754 / 5599
    已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果。

    输入

    输入数据占2行,其中第一行表示中序遍历结果,第二行为先序遍历结果。

    输出

    对测试数据,输出后序遍历结果。

    样例输入

    BFDAEGC
    ABDFCEG

    样例输出

    FDBGECA 
      1 #include<iostream>
      2 #include<algorithm>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<cstdio>
      6 typedef char Datetype;
      7 using namespace std;
      8 int x;
      9 
     10 typedef struct link{
     11     Datetype date;
     12     struct link *lchild;
     13     struct link *rchild;
     14 }tree;
     15 
     16 typedef struct queue{
     17     tree *data;
     18     struct queue *next;
     19 }que;
     20 
     21 typedef struct {
     22     que *front;
     23     que *rear;
     24 }lin;
     25 
     26 void Initqueue(lin *&L)
     27 {
     28     L=(lin *)malloc(sizeof(lin));
     29     L->front=L->rear=NULL;
     30 }
     31 
     32 void destroyed(lin *&L)
     33 {
     34     que *p=NULL,*r=NULL;
     35     p=L->front;
     36     while(p!=NULL)
     37     {
     38         r=p;
     39         p=p->next;
     40         free(r);
     41     }
     42     free(L);
     43 }
     44 
     45 bool pop(lin *&L, tree *&e)
     46 {
     47     que *p;
     48     if(L->rear==NULL)
     49         return false;
     50     p=L->front;
     51     if(L->rear==L->front)
     52         L->front=L->rear=NULL;
     53     else
     54         L->front=p->next;
     55     e=p->data;
     56     free(p);
     57     return true;
     58 }
     59 
     60 int empty(lin *&L)
     61 {
     62     return (L->rear==NULL);
     63 }
     64 
     65 void push(lin *&L,tree *e)
     66 {
     67     que *p;
     68     p = (que *)malloc(sizeof(que));
     69     p->data=e;
     70     p->next=NULL;
     71     if(L->rear==NULL)
     72     {
     73         L->front=p;
     74         L->rear=p;
     75     }
     76     else
     77     {
     78         L->rear->next=p;
     79         L->rear=p;
     80     }
     81 }
     82 
     83 void creattree(tree *&L)
     84 {
     85     char c;
     86     cin>>c;
     87     if(c=='#')
     88         L=NULL;
     89     else
     90     {
     91         L = (tree *)malloc(sizeof(tree)) ;
     92         L->date=c;
     93         creattree(L->lchild);
     94         creattree(L->rchild);
     95     }
     96 }
     97 
     98 void find(tree *L)
     99 {
    100     if(L!=NULL)
    101     {
    102         x++;
    103         find(L->rchild);
    104     }
    105 }
    106 
    107 void destroytree(tree *&L)
    108 {
    109     if(L!=NULL)
    110     {
    111         destroytree(L->lchild);
    112         destroytree(L->rchild);
    113         free(L);
    114     }
    115 }
    116 
    117 int deep(tree *L)
    118 {
    119     int ldep,rdep,max;
    120     if(L!=NULL)
    121     {
    122         ldep=deep(L->lchild);
    123         rdep=deep(L->rchild);
    124         max=ldep>rdep?ldep+1:rdep+1;
    125         return max;
    126     }
    127     else
    128         return 0;
    129 }
    130 
    131 void finddegree(tree *&L, int n)
    132 {
    133     if(L!=NULL)
    134     {
    135         if(x<n)
    136             x=n;
    137         finddegree(L->lchild,n);
    138         finddegree(L->rchild,n+1);
    139     }
    140 
    141 }
    142 
    143 void run(tree *L)
    144 {
    145     tree *p=L;
    146     lin *qu;
    147     Initqueue(qu);
    148     if(L!=NULL)
    149         push(qu,p);
    150     while(!empty(qu))
    151     {
    152         pop(qu,p);
    153         cout<<p->date;
    154         if(p->lchild!=NULL)
    155             push(qu,p->lchild);
    156         if(p->rchild!=NULL)
    157             push(qu,p->rchild);
    158     }
    159     destroyed(qu);
    160 }
    161 
    162 void display(tree *&L)
    163 {
    164     if(L!=NULL)
    165     {
    166         display(L->lchild);
    167         display(L->rchild);
    168         cout<<L->date;
    169     }
    170 }
    171 
    172 void creat(tree *&L ,char *in,char *pre,int x)
    173 {
    174     int k=0;
    175     char *p;
    176     if(x<=0)
    177     {
    178         L=NULL;
    179         return ;
    180     }
    181     L=(tree *)malloc(sizeof(tree));
    182     L->date = *pre;
    183     for(p=in ; p<in+x; p++)
    184     {
    185         if(*p==*pre)
    186             break;
    187     }
    188     k=p-in;
    189     creat(L->lchild,in,pre+1,k);
    190     creat(L->rchild,p+1,pre+k+1,x-k-1);
    191 }
    192 
    193 int main()
    194 {
    195     tree *L = NULL;
    196     x=0;
    197     char in[100],pre[100];
    198     cin>>in;
    199     cin>>pre;
    200     x=strlen(in);
    201     creat(L,in,pre,x);
    202     display(L);
    203     destroytree(L);
    204     return 0;
    205 }
  • 相关阅读:
    java中getResourceAsStream的问题 缓存
    springside 查询条件
    如何修改MySQL数据库引擎为INNODB
    获取用户真实 IP , 淘宝IP接口获得ip地理位置
    hibernate注解的CascadeType属性
    AssignmentHandler实现类用spring注入
    使用 jQuery dataTables
    转载:一致性 hash 算法( consistent hashing )
    转载:memcached完全剖析
    转载:连接MySQL数据库的两种方式介绍
  • 原文地址:https://www.cnblogs.com/Iwpml-595/p/10712969.html
Copyright © 2011-2022 走看看