华师一附中OI组
标题:
教授的测试(二叉树计数)
[打印本页]
作者:
admin
时间:
2020-1-29 10:52
标题:
教授的测试(二叉树计数)
一年一度的研究生面试又快要来临了。为了测试学生对树结构的认识,同时也检验他们的编程能力,福州大学计算机系把面试的一项内容定为:要求学生们编程按编号顺序打印出节点个数不少于m的所有二叉树。
二叉树编号规则如下:
仅有一个节点的树编号为1。
当满足以下条件之一时,定义二叉树a的编号比b大:
1. a的节点数比b多。
2. 若a的节点数与b相等,且a的左子树编号比b的左子树大。
3. a的节点数和左子树编号都和b相等,且a的右子树编号比b的右子树大。
二叉树的节点用大写X表示,例如:
当然当m较大时,检验答案对错的工作也是很繁重的,所以教授只打算对其中的若干个编号的二叉树进行抽查,他想麻烦你编制一个程序能够产生编号为n的二叉树的标准答案。
Input 输入数据由多组数据组成。每组数据仅一个整数,表示n (1≤n≤10^8)的值。输入数据以n=0表示结束,该数据不要处理。
Output 对于每组数据,输出仅一行,即你求出的标准答案。
二叉树的输出格式为:
(左子树){若左子树为空则省略}X{根}(右子树){若右子树为空则省略}
其中{…}中的内容是说明,不必输出。例如,在上图中编号为5的树可表示为X((X)X);编号为6的树表示为(X)X(X)。
Sample Input
20
0
Sample Output
((X)X(X))X
作者:
admin
时间:
2020-1-29 11:05
来一组测试数据
输入
2727
45678
80270
12163
82596
53868849
66951445
95227629
98046525
1154205
0
输出
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((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))))
作者:
admin
时间:
2020-1-31 11:23
#include <bits/stdc++.h>
using namespace std;
const int catalan[18] = {1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790};
int n;
int nodes(int x)
{
int sum = 0;
for (int i=1; i<=17; i++)
{
sum += catalan[i];
if (sum>x) return i;
}
return 18;
}
void dfs(int node,int x)
{
if (node==0) return ;
if (node==1)
{
cout<<"X";
return ;
}
int temp_no = x;
int left = 0,right = node - 1;
while (1)
{
int temp;
if ((temp = catalan[left]*catalan[right])>=temp_no)
break;
temp_no -= temp;
left ++;
right --;
}
if (left>0)
{
cout<<"(";
dfs(left,(temp_no - 1)/catalan[right] + 1);
cout<<")";
}
cout<<"X";
if (right>0)
{
cout<<"(";
dfs(right,(temp_no - 1)%catalan[right] + 1);
cout<<")";
}
}
int main()
{
cin>>n;
int node = nodes(n);
int temp = n;
for (int i=1; i<node; i++)
temp -= catalan[i];
dfs(node,temp);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2