#117-【二叉樹】FBI樹
阿新 • • 發佈:2018-11-09
Description
我們可以把由“0”和“1”組成的字串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。
FBI樹是一種二叉樹1,它的結點型別也包括F結點,B結點和I結點三種。由一個長度為2N的“01”串S可以構造出一棵FBI樹T,遞迴的構造方法如下:
1) T的根結點為R,其型別與串S的型別相同;
2) 若串S的長度大於1,將串S從中間分開,分為等長的左右子串S1和S2;由左子串S1構造R的左子樹T1,由右子串S2構造R的右子樹T2。
現在給定一個長度為2N的“01”串,請用上述構造方法構造出一棵FBI樹,並輸出它的後序遍歷2序列。
Input
輸入的第一行是一個整數N(0<=N<=10),第二行是一個長度為2^N的“01”串。
Output
輸出包括一行,這一行只包含一個字串,即FBI樹的後序遍歷序列。
Sample Input
3
10001011
Sample Output
IBFBBBFIBFIIIFF
直接模擬
#include <iostream> #include <cmath> #include <string> #define SIZE 2050 using namespace std; string s; int l; char c[SIZE]; void print(int x) // 先序遍歷 { if (x >= l) { return; } print(x + x); print(x + x + 1); printf("%c", c[x]); return; } int main(int argc, char** argv) { int n, len, i; scanf("%d", &n); cin >> s; len = pow(2, n); l = len << 1; for (i = len; i < len + len; ++i) { if (s[i-len] == '0') // 最底層 { c[i] = 'B'; } else { c[i] = 'I'; } } len >>= 1; while (len) { for (i = len; i < len + len; ++i) // 一層一層遞推 { if (c[i+i] == c[i+i+1]) { c[i] = c[i+i]; } else { c[i] = 'F'; } } len >>= 1; } print(1); return 0; }