問題描述bracket pair colorizer
我們可以把由「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
using namespace std;
struct
node};
intfind
(string s)
//純0返回0 純1 返回1 10混合 返回2
if(flag0==
0&&flag1==1)
return0;
else
if(flag0==
1&&flag1==0)
return1;
else
}void
dfs(node *
&r)void
visit
(node *r)
visit
(r->left)
;visit
(r->right)
; string str = r->s;if(
find
(str)==0
) cout <<
"b";
elseif(
find
(str)==1
) cout <<
"i";
else
}int
main()
/* 設計思路 插入 排序 右小到大
*/
FBI樹 字元二叉樹
小記 花了好長時間,這道題主要是考二叉樹的後序遍歷,是個模板,但是不同於一般的根據陣列插入數字構造二叉樹,本題中的二叉樹結點資料是字元,並且是根據字串算出來了。postorder 函式就是原版的後序遍歷函式不需要修改的,不同的是newnode 需要稍加修改,通過呼叫函式tp 來計算當前節點的data...
FBI樹(二叉樹的遍歷)
題目描述 我們可以把由 0 和 1 組成的字串分為三類 全 0 串稱為b串,全 1 串稱為i串,既含 0 又含 1 的串則稱為f串。fbi樹是一種二叉樹 1 它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2n的 01 串s可以構造出一棵fbi樹t,遞迴的構造方法如下 t的根結點為r,其型...
根據二叉樹建立字串
你需要採用前序遍歷的方式,將乙個二叉樹轉換成乙個由括號和整數組成的字串。空節點則用一對空括號 表示。而且你需要省略所有不影響字串與原始二叉樹之間的一對一對映關係的空括號對。示例 1 輸入 二叉樹 1 2,3 4 1 23 4 輸出 1 2 4 3 解釋 原本將是 1 2 4 3 在你省略所有不必要的...