FBI树(信息学奥赛一本通-T1365)
生活随笔
收集整理的這篇文章主要介紹了
FBI树(信息学奥赛一本通-T1365)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
我們可以把由“0”和“1”組成的字符串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。
FBI樹是一種二叉樹,它的結點類型也包括F結點,B結點和I結點三種。由一個長度為2N的“01”串S可以構造出一棵FBI樹T,遞歸的構造方法如下:
T的根結點為R,其類型與串S的類型相同;
若串S的長度大于1,將串S從中間分開,分為等長的左右子串S1和S2;由左子串S1構造R的左子樹T1,由右子串S2構造R的右子樹T2。
現在給定一個長度為2N的“01”串,請用上述構造方法構造出一棵FBI樹,并輸出它的后序遍歷序列。
【輸入】
第一行是一個整數N(0 ≤ N ≤ 10),第二行是一個長度為2N的“01”串。
【輸出】
一行,這一行只包含一個字符串,即FBI樹的后序遍歷序列。
【輸入樣例】
3
10001011
【輸出樣例】
IBFBBBFIBFIIIFF
【提示】
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 3001 #define MOD 123 #define E 1e-6 using namespace std; int n; char a[N],b[N]; void build(char *s,int n) {int k=0;for(int i=(1<<n);i<=(1<<(n+1))-1;i++){if(a[k++]=='0')b[i]='B';elseb[i]='I';}for(int i=n-1;i>=0;i--)for(int j=(1<<i);j<=(1<<(i+1))-1;j++){if(b[2*j]=='B'&&b[2*j+1]=='B')b[j]='B';else if(b[2*j]=='I'&&b[2*j+1]=='I')b[j]='I';elseb[j]='F';} } void visit(int node) {if(node>( 1<<(n+1))-1 )return;visit(node*2);visit(node*2+1);cout<<b[node]; } int main() {cin>>n;cin>>a;build(a,n);visit(1);return 0; }?
?
?
總結
以上是生活随笔為你收集整理的FBI树(信息学奥赛一本通-T1365)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抓住那头牛(信息学奥赛一本通-T1253
- 下一篇: 复制书稿(信息学奥赛一本通-T1278)