FBI樹兩種解法

2021-10-02 03:39:59 字數 1409 閱讀 6795

【問題描述】

我們可以把由「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樹,並輸出它的後序遍歷序列。

【輸入檔案】

輸入檔案fbi.in的第一行是乙個整數n(0<=n<=10),第二行是乙個長度為2n的「01」串。

【輸出檔案】

輸出檔案fbi.out包括一行,這一行只包含乙個字串,即fbi樹的後序遍歷序列。

【樣例輸入】

310001011

【樣例輸出】

ibfbbbfibfiiiff

【資料規模】

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

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

從上至下,儲存當前整棵樹的根節點型別,再從中切斷遞迴生成各個左右子樹根節點型別,遞迴邊界是二分到當前子樹為空

#include using namespace std;

int a[20] = ;

int s[20] = ;//用於判斷某一範圍內是哪種節點,在迴圈的基礎上做了一點優化,s[3] - s[1]就能判斷3到2範圍內是什麼值。

struct node;

void create(node *t,int st,int ed)

void print(node *p)

int main()

從下至上依次生成節點,直到根節點
//if(node[k*2]=='b' && node[k*2+1]=='i'|| node[k*2]=='i' && node[k*2+1]=='b'|| node[k*2]=='f' || node[k*2+1]=='f')

#includeusing namespace std;

int n,m=1;

char node[10000000];

void houxu(int k)

int main()

else

}for(int i = 1; i<2*m; i++)

cout << node[i] <<" ";

cout <0;k--)

else if(node[k*2]=='i'&&node[k*2+1]=='i')

else node[k] = 'f'; }

houxu(1);

}

Bacon Number 兩種解法

view code 題目 cid 567 題目分析 與longth way 類似 這個好象就是傳說中的六度人脈,你只要通過六度人脈就可以找到世界上的任何乙個人。假設乙個人一生會認識n個人,那n n 1 n 2 n 3 n 4 n 5 n 6 世界總人數。給定一些邊確定乙個圖,即給定一些點之間的連通情...

The Longest Path 兩種解法

view code 題目 cid 567 題目分析 給定一些邊確定乙個圖,即給定一些點之間的連通情況,保證給定的圖沒有迴路,要求輸出該圖存在的最長路徑。思路分析 根據給定資訊構造圖,用鄰接表表示。鄰接矩陣明顯很麻煩且效率不高 將每乙個頂點看成是樹根,求出樹的高度。得到一系列樹的高度,最大的那個就是圖...

最小生成樹兩種解法

運用了貪心的演算法。是從某個頂點開始不斷新增邊的演算法。int cost max v max v 存邊權 int mincost max v 從集合x出發的邊到每個頂點的最小權值 int book max v int v intprim mincost 0 0 int res 0 while 1 i...