这道题感觉上只是一道简单的推理题,它的难点应该是把生成树的规律找出来吧。
首先,我们要得到一个节点数为x的二叉树有几种,这里用arr[x]表示。据说有一个叫做卡特兰的公式可以确定这个数组。但实际上只要通过观察即可发现,通过枚举左右子树的数量可以得到arr[x]:
其次,如果一棵树的序号为X,如何确定其节点数:
由于题目已经说明:All binary trees having m nodes have numbers less than all those having m+1 nodes.
我们定义数组sum,其中sum[x]为节点数不大于x的树的总和。可得:
最后,得到节点数后,只需要确定左右子树需要表示的序号lx, rx,再对其进行递归即可。
下面是代码:
这篇文章参考了:
http://www.cppblog.com/abilitytao/archive/2010/04/13/112476.html
这篇报告算是对这篇文章的一个补充,希望对你理解这种解法有所帮组。