noip普及組2004 FBI樹
阿新 • • 發佈:2017-07-29
length name 組成 clas turn line fib 遍歷 bool
FBI樹
描述
我們可以把由“0”和“1”組成的字符串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。
FBI樹是一種二叉樹1,它的結點類型也包括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樹,並輸出它的後序遍歷2序列。
格式
輸入格式
輸入的第一行是一個整數N(0<=N<=10),第二行是一個長度為2^N的“01”串。
輸出格式
輸出包括一行,這一行只包含一個字符串,即FBI樹的後序遍歷序列。
樣例1
樣例輸入1
3
10001011
樣例輸出1
IBFBBBFIBFIIIFF
限制
每個測試點1s
dfs
#include <algorithm> #include <iostream> #include <string> using namespace std; //ifstream cin("fbi.in",ios :: in); //ofstream cout("fbi.out",ios :: out); string str; int n; inline void dfs(int L,int R) { if (L == R) { //走到葉節點 if (str[L] == ‘0‘) cout << ‘B‘; else cout << ‘I‘; return; //結束 } int mid = (L+R)/2; //取中間值 dfs(L,mid); //左兒子 dfs(mid+1,R); //右兒子 bool zero = false,one = false; for (int i = L;i <= R;i++) if (str[i] == ‘1‘) one = true; else if (str[i] == ‘0‘) zero = true; if (one && zero) cout << ‘F‘; //既有0又有1 else if (one && !zero) cout << ‘I‘; //全1 else cout << ‘B‘; //全0 } int main() { ios :: sync_with_stdio(false); cin >> n >> str; dfs(0,str.length()-1); //後序遍歷 return 0; }
noip普及組2004 FBI樹