• 二叉树的后序遍历(暴力版) 小白菜oj 1034


    给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历……

    作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法……但只是估计……

    下面讲述我的超暴力解法……

    首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可。

    但这个方法有两个比较……&¥……&的问题:
    1.在取区间内前序遍历最靠前的节点时,如果用for循环,必炸无疑(数据范围大的话),所以我就想到了用线段树或树状数组来维护这个值……

    2.建树的时候,如果树退化为一条链或类似链的很长的树,那用数组来存就崩掉了,于是我就想到了用指针的方法,因为以前写过几次用指针来建立Splay……

    这样一来,写起来就显得非常麻烦了……很暴力……

    果不其然,我没写出来……

    于是本蒟蒻奉上一份没有解决以上两个问题的代码,虽然过不掉……但进行一些小数据的对拍还是有用的.....好牵强……

    代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<string>
     5 #include<cmath>
     6 #include<algorithm>
     7 using namespace std;
     8 char tre[10000000];
     9 char qian[10000000],zhong[10000000],hou[10000000];
    10 int qian_n[10000000],zhong_n[10000000],l,nume;
    11 
    12 void dfs(int num,int le,int r){
    13     if(le>r) return;
    14     int o=70000000;
    15     int oo=70000000;
    16     for(int i=le;i<=r;i++){
    17         if(qian_n[zhong[i]]<o){
    18             o=qian_n[zhong[i]];
    19             oo=i;
    20         } 
    21     }
    22     tre[num]=zhong[oo];
    23     if(oo>0) dfs(num*2,le,oo-1);
    24     if(oo<l) dfs(num*2+1,oo+1,r);
    25 }
    26 
    27 void adfs(int x){
    28     if(tre[x*2]!='*') adfs(x*2);
    29     if(tre[x*2+1]!='*') adfs(x*2+1);
    30     nume++;
    31     hou[nume]=tre[x];
    32 }
    33 
    34 int main(){
    35     for(int i=0;i<=9999999;i++) tre[i]='*';
    36     cin>>qian;
    37     cin>>zhong;
    38     l=strlen(qian)-1;
    39     for(int i=0;i<=l;i++) qian_n[i+65]=i;
    40     for(int i=0;i<=l;i++) zhong_n[i+65]=i;
    41     dfs(1,0,l);
    42     nume=0;
    43     adfs(1);
    44     for(int i=1;i<=l+1;i++) cout<<hou[i];
    45     return 0;
    46 }

    8月22日标程:

    好吧,我太弱了,那份超暴力的很炫的做法没写出来……

    那就只好交标程了:

    标程是这个样子的:

    还是利用我暴力的中序遍历和前序遍历的性质,但这次不建树了,直接搜寻左儿子和右儿子,然后记录到答案里——直接看代码吧,还是比较易懂的……

    代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7  
     8 #include<string>
     9 #include<stack>
    10 #include<queue>
    11 #include<vector>
    12 #include<algorithm>
    13 #include<map>
    14  
    15 using namespace std;
    16  
    17 inline void read(int &x){
    18     x=0;
    19     char t=getchar();
    20     bool f=0;
    21      
    22     while(t<'0' || t>'9'){
    23         if(t=='-')f=1;
    24         t=getchar();
    25     }
    26      
    27     while(t>='0' && t<='9'){
    28         x=(x<<3)+(x<<1)+t-'0';
    29         t=getchar();
    30     }
    31      
    32     if(f)x=-x;
    33 }
    34  
    35 void dfs(int,int,int,int);
    36  
    37 char s1[110];
    38 char s2[110];
    39  
    40 int p[110];
    41  
    42 char s3[110];
    43 int zh=0;
    44  
    45 int len1,len2,i;
    46  
    47 int main(){
    48     scanf("%s",s1);
    49     scanf("%s",s2);
    50      
    51     len1=strlen(s1);
    52     len2=strlen(s2);
    53      
    54     for(i=0;i<len2;i++)p[s2[i]]=i;
    55      
    56     dfs(0,len1-1,0,len2-1);
    57      
    58     for(i=1;i<=len1;i++)putchar(s3[i]);
    59      
    60     return 0;
    61 }
    62  
    63 void dfs(int l1,int r1,int l2,int r2){
    64     if(l1>r1 || l2>r2)return;
    65      
    66     int m=p[s1[l1]];
    67     int llen=m-l2;
    68     int rlen=r2-m;
    69      
    70     dfs(l1+1,l1+llen,l2,m-1);
    71     dfs(l1+llen+1,r1,m+1,r2);
    72      
    73     zh++;
    74     s3[zh]=s1[l1];
    75 }

    ...代码不是我写的……

  • 相关阅读:
    js:通过正则匹配获取页面的url中的参数
    BZOJ 4873 寿司餐厅 网络流
    BZOJ 3308 毒瘤结论 网络流
    BZOJ3451 CDOJ1562点分治+FFT
    P3731 二分图匹配必经边
    Hdu 6268 点分治 树上背包 bitset 优化
    Hdu 1517 巴什博奕变形
    dsu on tree
    CF #546 D.E
    HNOI 世界树 虚树
  • 原文地址:https://www.cnblogs.com/Misaki-Mei/p/7407077.html
Copyright © 2020-2023  润新知