題目描述
我們可以把由“0”和“1”組成的字符串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。
FBI樹是一種二叉樹,它的結點類型也包括F結點,B結點和I結點三種。由一個長度為2^N的“01”串S可以構造出一棵FBI樹T,遞歸的構造方法如下:
1) T的根結點為R,其類型與串S的類型相同;
2) 若串S的長度大於1,將串S從中間分開,分為等長的左右子串S1和S2;由左子串S1構造R的左子樹T1,由右子串S2構造R的右子樹T2。
現在給定一個長度為2^N的“01”串,請用上述構造方法構造出一棵FBI樹,並輸出它的后序遍歷序列。
輸入輸出格式
輸入格式:
第一行是一個整數N(0 <= N <= 10),第二行是一個長度為2^N的“01”串。
輸出格式:
包括一行,這一行只包含一個字符串,即FBI樹的后序遍歷序列。
輸入輸出樣例
輸入樣例:
3
10001011
輸出樣例:
IBFBBBFIBFIIIFF
二叉樹一道比較基本的題,就是對半開,然后一直遞歸到頭,在判斷是F還是B還是I就行了。因為題目要求要按照后序排列輸出,所以先看左半部分再看右半部分,最后打印此節點的字母。
代碼如下:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 int n,m; 5 char s[1100]; 6 void buildFBItree(int x,int y) 7 { 8 int cnt0,cnt1; 9 if (x==y) 10 { 11 if (s[x]=='0') 12 printf("B"); 13 else 14 printf("I"); 15 } 16 else 17 { 18 int mid=(y-x-1)/2; 19 buildFBItree(x,x+mid); 20 buildFBItree(y-mid,y); 21 cnt0=cnt1=0; 22 for (int i=x;i<=y;++i) 23 { 24 if (s[i]=='0') 25 cnt0++; 26 else 27 cnt1++; 28 } 29 if (cnt0==0) 30 printf("I"); 31 else if (cnt1==0) 32 printf("B"); 33 else 34 printf("F"); 35 } 36 } 37 int main() 38 { 39 //freopen("de.txt","r",stdin); 40 while (~scanf("%d",&n)) 41 { 42 scanf("%s",s); 43 m=(int)pow(2.0,n); 44 buildFBItree(0,m-1); 45 printf("\n"); 46 } 47 return 0; 48 }