二叉树的后序遍历(暴力版) 小白菜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 }
...代码不是我写的……