洛谷 P1087 FBI樹(二叉樹)題解

2021-09-26 05:05:51 字數 1490 閱讀 7958

題目描述

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

fbi樹是一種二叉樹,它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2^n的「01」串s可以構造出一棵fbi樹t,遞迴的構造方法如下:

t的根結點為r,其型別與串s的型別相同;

若串s的長度大於1,將串s從中間分開,分為等長的左右子串s1和s2;由左子串s1構造r的左子樹t1,由右子串s2構造r的右子樹t2。

現在給定乙個長度為2^n的「01」串,請用上述構造方法構造出一棵fbi樹,並輸出它的後序遍歷序列。

輸入輸出格式

輸入格式:

第一行是乙個整數n (0 ≤ n ≤ 10),

第二行是乙個長度為2^n的「01」串。

輸出格式:

乙個字串,即fbi樹的後序遍歷序列。

輸入輸出樣例

輸入樣例#1:

310001011

輸出樣例#1:

ibfbbbfibfiiiff

說明

時空限制:1000ms 125m

對於40%的資料,n ≤ 2;

對於全部的資料,n ≤ 10。

noip2004普及組第3題

思路:

先遍歷字串構建子樹,當然是樹的先序遍歷(先根節點,再左右子樹)。如果節點長度大於1,則在遞迴中不斷構建子樹。

確定每個節點0的個數。

輸出樹的後序遍歷序列。因為構建子樹是在遞迴中先序遍歷(先左右節點,後根節點),所以可以在遞迴中輸出。如果全為0,則輸出b,如果全為1,則輸出i,否則輸出f。

**如下:

#include 

#include

#include

using namespace std;

int n;

string str;

void

fbi(

int a,

int b)

int num=0;

//記錄0的個數

for(

int i=a;i<=b;i++)if

(num==b-a+1)

//如果全0則是b串

cout<<

'b';

else

if(num==0)

//如果全1則是i串

cout<<

'i';

else

//如果0和1都有則是f串

cout<<

'f';

}int

main()

樹 洛谷 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...

洛谷 P1087 FBI樹(簡單的遞迴建樹)

我們可以把由 00 和 11 組成的字串分為三類 全 00 串稱為bb串,全 11 串稱為i串,既含 00 又含 11 的串則稱為f串。fbifbi樹是一種二叉樹,它的結點型別也包括ff結點,bb結點和i結點三種。由乙個長度為2 n2n的 0101 串s可以構造出一棵fbifbi樹tt,遞迴的構造方...

FBI樹 字元二叉樹

小記 花了好長時間,這道題主要是考二叉樹的後序遍歷,是個模板,但是不同於一般的根據陣列插入數字構造二叉樹,本題中的二叉樹結點資料是字元,並且是根據字串算出來了。postorder 函式就是原版的後序遍歷函式不需要修改的,不同的是newnode 需要稍加修改,通過呼叫函式tp 來計算當前節點的data...