1. 程式人生 > >#117-【二叉樹】FBI樹

#117-【二叉樹】FBI樹

Description

我們可以把由“0”和“1”組成的字串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。

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

Input

輸入的第一行是一個整數N(0<=N<=10),第二行是一個長度為2^N的“01”串。

Output

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

Sample Input

3
10001011

Sample Output

IBFBBBFIBFIIIFF

直接模擬

#include <iostream>
#include <cmath>
#include <string>

#define SIZE 2050

using namespace std;

string s;
int l;
char c[SIZE];

void print(int x) // 先序遍歷
{
	if (x >= l)
	{
		return;
	}
	print(x + x);
	print(x + x + 1);
	printf("%c", c[x]);
	
	return;
}

int main(int argc, char** argv)
{
	int n, len, i;
	
	scanf("%d", &n);
	cin >> s;
	
	len = pow(2, n);
	l = len << 1;
	for (i = len; i < len + len; ++i)
	{
		if (s[i-len] == '0') // 最底層
		{
			c[i] = 'B';
		}
		else
		{
			c[i] = 'I';
		}
	}
	len >>= 1;
	while (len)
	{
		for (i = len; i < len + len; ++i) // 一層一層遞推
		{
			if (c[i+i] == c[i+i+1])
			{
				c[i] = c[i+i];
			}
			else
			{
				c[i] = 'F';
			}
		}
		len >>= 1;
	}
	
	print(1);
	
	return 0;
}