藍橋杯 演算法訓練 FBI樹

2021-09-13 01:54:53 字數 1569 閱讀 4771

演算法訓練 fbi樹  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

我們可以把由「0」和「1」組成的字串分為三類:全「0」串稱為b串,全「1」串稱為i串,既含「0」又含「1」的串則稱為f串。

fbi樹是一種二叉樹,它的結點型別也包括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樹,並輸出它的後序遍歷序列。

輸入格式

第一行是乙個整數n(0 <= n <= 10),第二行是乙個長度為2n的「01」串。

輸出格式

包括一行,這一行只包含乙個字串,即fbi樹的後序遍歷序列。

樣例輸入

310001011

樣例輸出

ibfbbbfibfiiiff

資料規模和約定

對於40%的資料,n <= 2;

對於全部的資料,n <= 10。

注:[1] 二叉樹:二叉樹是結點的有限集合,這個集合或為空集,或由乙個根結點和兩棵不相交的二叉樹組成。這兩棵不相交的二叉樹分別稱為這個根結點的左子樹和右子樹。

[2] 後序遍歷:後序遍歷是深度優先遍歷二叉樹的一種方法,它的遞迴定義是:先後序遍歷左子樹,再後序遍歷右子樹,最後訪問根。

思路:

從上到下,從左到右  去構造二叉樹!!!

用佇列裝每乙個節點,每次取兩個構造乙個新節點。

直接看**就明白了。

(附:一名小菜鳥,多多指點。^.^)

#include#include#include#include#include#include#includeusing namespace std;

int n;

string s;

int mid;

typedef struct btree

bt;bt *tree;

queue q;

void create()

if(t0->c=='b' && t1->c=='b' )

if((t0->c=='i' && t1->c=='b' ) || (t0->c=='b' && t1->c=='i'))

if(t0->c=='f' || t1->c=='f' )

t2->lch=t0;

t2->rch=t1;

q.push(t2);

} }void houxu(bt *tree)

int main()

else if(s[i]=='0')

if(s[i+1]=='1')

else if(s[i+1]=='0')

}create();

houxu(q.front());

return 0;

}

藍橋杯 演算法訓練 FBI樹(二叉樹)

演算法訓練 fbi樹 時間限制 1.0s 記憶體限制 256.0mb 問題描述 我們可以把由 0 和 1 組成的字串分為三類 全 0 串稱為b串,全 1 串稱為i串,既含 0 又含 1 的串則稱為f串。fbi樹是一種二叉樹,它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2 n的 01 串...

藍橋杯之FBI樹問題

問題描述 我們可以把由 0 和 1 組成的字串分為三類 全 0 串稱為b串,全 1 串稱為i串,既含 0 又含 1 的串則稱為f串。fbi樹是一種二叉樹,它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2n的 01 串s可以構造出一棵fbi樹t,遞迴的構造方法如下 1 t的根結點為r,其型...

藍橋杯演算法訓練 格仔操作 線段樹

這題設計最基本的線段樹應用,同時考察區間和與區間最值,我採用乙個造樹函式,乙個更新函式和兩個查詢查詢函式,兩個查詢函式分別返回區間和與區間最大值。問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的...