• 2010 求后序遍历


    2010 求后序遍历

     

     时间限制: 1 s
     空间限制: 64000 KB
     题目等级 : 白银 Silver
     
     
    题目描述 Description

    输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。

    输入描述 Input Description

    共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。

    输出描述 Output Description

    仅一行,表示树的后序遍历序列。

    样例输入 Sample Input

    abdehicfg

    dbheiafcg

    样例输出 Sample Output

    dhiebfgca

    数据范围及提示 Data Size & Hint

    输入长度不大于255。

     1 #include<cstring>
     2 #include<iostream>
     3 #include<cstdio>
     4 using namespace std;
     5 string s1,s2;
     6 void calc(int l1,int r1,int l2,int r2)
     7 {
     8                                 //前序遍历的每个分块的第一个值为根节点,我从中序遍历里找到其相应位置,
     9                                 //之前即为左子树的范围,之后为右子树的范围
    10     int m=s2.find(s1[l1]);
    11     if(m>l2) calc(l1+1,l1+m-l2,l2,m-1);//判断条件是当找到了最底层的节点的时候就不做了(此时m=l2)
    12                                                     //l1+1:下一个左子树最开头的节点的位置,l1-k+l2:通过中序遍历求出左子树的范围进而找到左子树最后一个节点的位置    
    13     if(m<r2) calc(l1+m-l2+1,r1,m+1,r2);//l1+k-l2+1:紧接着右子树第一个节点也就是根节点的位置(l1+k-l2是左子树最后一个节点的位置,加一即为右子树第一个节点)
    14     cout<<s1[l1];                        //因为求后序遍历所以递归调用最后才输出根节点的值
    15 }
    16 
    17 int main()
    18 {
    19     cin>>s1>> s2;
    20     calc(0,s1.length()-1,0,s2.length()-1);
    21     cout<<endl;
    22     return 0;
    23 }
  • 相关阅读:
    hdu 6182A Math Problem(快速幂)
    861. 二分图的最大匹配(匈牙利算法模板)
    860. 染色法判定二分图(模板)
    859. Kruskal算法求最小生成树(模板)
    858. Prim算法求最小生成树(模板)
    洛谷 P2577 [ZJOI2005]午餐
    洛谷 P2286 [HNOI2004]宠物收养场
    【模板】Splay
    P2234 [HNOI2002]营业额统计
    洛谷 P3369 【模板】普通平衡树
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6648053.html
Copyright © 2020-2023  润新知