1. 程式人生 > >二叉樹的後序遍歷(暴力版) 小白菜oj 1034

二叉樹的後序遍歷(暴力版) 小白菜oj 1034

algorithm esp cstring 父親節 names mat 中序遍歷 char 估計

給出二叉樹的前序遍歷和中序遍歷,求二叉樹的後序遍歷……

作為一個搜索蒟蒻,我真的沒有辦法很和諧的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 }

二叉樹的後序遍歷(暴力版) 小白菜oj 1034