Trees Made to Order
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
const int LEN = 30;
class OrderTree
{
private:
static int kinds[LEN];//kinds[i]表示有i个结点情况下共有多少种不同的树
static int oindex[LEN];//oindex[i]表示有i个结点情况下的起始标记
public:
static string rTree(int m,int index)//m nodes的第index个
{
if (m == 0)return "";
if (m == 1)return "X";
int left,//左子树L含有的结点个数为left;
right;//右子树R含有的结点个数为right;
int sum = 0;
for (left = 0; left < m-1; ++left)
{
if (sum + kinds[left]*kinds[m-left-1] >= index)break;
sum += kinds[left]*kinds[m-left-1];
}
right = m - 1 -left;//右子树个数
int i,j;
for (i = 1; i <= kinds[left]; ++i)
{
if (sum + kinds[right] >= index)break;
sum += kinds[right];
}
j = index - sum;
string sl = rTree(left,i);//左子树为left个结点的第i个
string sr = rTree(right,j);//左子树为right个结点的第j个
if (sl == "")return "X("+sr+")";
if (sr == "")return "("+sl+")X";
return "(" + sl + ")X(" +sr+ ")";
}
static string getResult(int n)//1 <= n <= 500,000,000
{
int i;
for (i = 0;; ++i)//结点个数
if (oindex[i] <= n && oindex[i+1] > n)break;
int index = n - oindex[i] + 1;
return rTree(i,index);//拥有i个结点的第index棵树
}
static void initKindsOindex()
{
kinds[0] = 1;
kinds[1] = 1;
kinds[2] = 2;
oindex[0] = 0;
oindex[1] = 1;
oindex[2] = 2;
oindex[3] = 4;//3个结点的起始索引
int i,left;
for (i = 3; i < LEN; ++i)
{
kinds[i] = 0;
for (left = 0; left < i; ++left)
kinds[i] += kinds[left]*kinds[i-left-1];
oindex[i+1] = oindex[i] + kinds[i];
if (oindex[i+1] > 500000000)break;
}
}
static void pKinds()
{
int i = 0;
for (; i < LEN; ++i)
cout<<kinds[i]<<" ";
cout<<endl;
}
static void pOindex()
{
int i = 0;
for (; i < LEN; ++i)
cout<<oindex[i]<<" ";
cout<<endl;
}
};
int OrderTree::kinds[LEN];
int OrderTree::oindex[LEN];
int main()
{
freopen("in.txt","r",stdin);
OrderTree::initKindsOindex();
int n;
while (cin>>n)
{
if(n == 0)break;
cout<<OrderTree::getResult(n)<<endl;
}
}
测试用例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
31117532
0
output:
X
X(X)
(X)X
X(X(X))
X((X)X)
(X)X(X)
(X(X))X
((X)X)X
X(X(X(X)))
X(X((X)X))
X((X)X(X))
X((X(X))X)
X(((X)X)X)
(X)X(X(X))
(X)X((X)X)
(X(X))X(X)
((X)X)X(X)
(X(X(X)))X
(X((X)X))X
((X)X(X))X
(X(X(((X(X))X(X))X(X))))X(((X((X)X((X)X)))X)X)