Luogu P1087 FBI树
生活随笔
收集整理的這篇文章主要介紹了
Luogu P1087 FBI树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?P1087 FBI樹
題目描述
我們可以把由“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樹的后序遍歷序列。
?
輸入輸出樣例
輸入樣例#1:輸出樣例#1:3 10001011
IBFBBBFIBFIIIFF
說明
對于40%的數據,N <= 2;
對于全部的數據,N <= 10。
noip2004普及組第3題
?
1 #include <cstdio> 2 #include <cmath> 3 4 struct node 5 { 6 char c; 7 node *lc, *rc; //左孩子右孩子 8 }; 9 char a[1030]; 10 11 // node * 要傳引用哦 12 void fbicreat(int lr, int rr, node *&p) 13 { 14 p = new node; 15 p->c = 'F'; //先設置成F 后面再判斷 16 17 //如果左右位置在一起,則表示此時的結點為葉 18 if(lr == rr) 19 { 20 if(a[lr] == '0') 21 p->c = 'B'; 22 else if(a[lr]=='1') 23 p->c = 'I'; 24 p->lc = p->rc = NULL; 25 return; 26 } 27 28 //這里的判斷參考了 keyword_ 的做法 29 bool b0, b1; //標志b0是0是否出現 30 b0 = b1 = 0; //標志b1是1是否出現 31 for(int i=lr; i<=rr; i++) 32 { 33 if(a[i]=='0') b0 = 1; 34 else if(a[i]=='1') b1 = 1; 35 } 36 if(b0 && !b1) //相信大家都能看懂 37 p->c = 'B'; 38 else if(b1 && !b0) 39 p->c = 'I'; 40 41 //二叉樹二分咯 42 fbicreat(lr, (lr+rr)/2, p->lc); 43 fbicreat((lr+rr)/2+1, rr, p->rc); 44 } 45 46 47 48 void houxu(node *p) 49 { 50 if(p) //如果是一棵真樹 51 { //后序遍歷: 左 右 根 52 houxu(p->lc); 53 houxu(p->rc); 54 printf("%c", p->c); 55 } 56 } 57 58 59 int main() 60 { 61 int n; 62 scanf("%d\n", &n); //這里記得把回車給讀取了 63 n = pow(2, n); 64 for(int i=0; i<n; i++) 65 scanf("%c", a+i); 66 67 node *p; 68 //從數組0位置到n-1位置建立FBI樹 69 fbicreat(0, n-1, p); 70 houxu(p); 71 return 0; 72 }
?
轉載于:https://www.cnblogs.com/yBaka/p/7366569.html
總結
以上是生活随笔為你收集整理的Luogu P1087 FBI树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装修要花多少钱啊?
- 下一篇: Java集合框架:EnumMap