数据结构与算法实验题 9.1 编码树
★实验任务
一棵二叉树要么为空,要么由一个根节点和它的两棵左右子树构成。我们这里的二叉
树的每个节点由一个小写字母组成。我们定义一棵二叉树为一棵二叉搜索树(BST),当且仅
当对于每一个节点满足一下条件:
? 对于每一个节点 ,它的左子树的所有字母在字母表中比它出现得早
? 对于每一个节点 ,它的右子树的所有字母在字母表中比它出现得晚
我们知道如果一棵树是一棵二叉搜索树,那么它的每个子树也是一棵二叉搜索树。以
下为四个节点的二叉搜索树的一些样例:
c b a
/ / / / /
b d a d c
/ / / /
a c b d
那么这样一棵二叉搜索树的前序遍历,将是一个字符串,将由以下形式构成:
? 一棵空的二叉搜索树将是一个空串
? 一棵非空的二叉搜索树将由以下形式构成:根节点 左子树 右子树
上面范例的前序遍历分别为"cbad", "badc"和 "acbd"。
我们现在要考虑的是只包含前N个小写字母的N个节点的二叉搜索树。将这些二叉搜索
树按他们前序遍历所产生的字符串的字典序排序。所得到的一系列字符串,编号从1开始。
然后返回这一系列字符串第index个字符串。如果index大于拥有N个节点的二叉搜索树的总
数,则输出空串。
★数据输入
输入包含多组测试数据每行两个数 N(1<=N<=19)和 index(1<=index<= 2,000,000,000)。
★数据输出
每组输出只有一行,由 N 个节点(N 个节点由前 N 个小写字母组成)构成的二叉搜索
树第 index 个前序遍历字符串。
输入示例 输出示例
2 3
2 1 ab
这道题目不是很难,最重要的是看你自己有没有了解数的前序遍历,对一棵树来说,在前序遍历中根节点肯定在第一位,根据字典排序,根节点应该先出现a,如果根节点为a的所有数总数仍小于index,就选下一个字母,以此类推,找到根节点后,就继续递归查找字数的根节点,至于树的不同形态可以有Catalan数求的。。。。
我的代码:
lude<stdio.h>
int a[20]={1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790,477638700,1767263190};
void fuck(char ch,int i,int m)
{
int t=0,j=i;
while(t<m&&--j>=0)//查找当前根节点
t+=a[j]*a[i-1-j];
m=m-t+a[j]*a[i-1-j];
printf("%c",ch+i-1-j);
if(i-1-j)
fuck(ch,i-1-j,(m-1)/a[j]+1);//查找左子树根节点
if(j)
fuck(ch+i-j,j,(m-1)%a[j]+1);//查找右子树根节点
}
void main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(a[n]>=m)
fuck('a',n,m);
printf("/n");
}
}