数据结构 编码树问题

数据结构与算法实验题 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");
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值