考查catalan数和递归。
1、首先要知道第n棵二叉树有几个节点。设catalan数为h(x),则h(x)可以表示x个节点的二叉树总共有多少种。若第n棵二叉树有x个节点,有n<=h(1)+h(2)+...+h(x),又称可以知道节点数,又设k为节点数为x的二叉树的第k种形态,有k=n-( h(1)+h(2)+...+h(x-1) );
2、接下来是递归建树,如何知道二叉树的形态呢?假设二叉树的根节点无左子树,那么必有:1<=k<=h(0)*h(x-1);若二叉树的根节点有左子树且只有一个节点,则k<=h(1)*h(x-2),以此类推。那么递归时的k值如何确定呢?首先,若左子树有i个节点,令k=k-( h(0)*h(x-1)+h(1)*h(x-2)+...+h(i-1)*h(x-i-2) ), 于是, 对于左子树,有left_k=(k-1)/h(x-i-1)+1,对右子树,有right_k= (k-1)%h(x-i-1)+1(原因不明。。。。。)。
代码如下:
#include <cstdio>
#include <stack>
#include <set>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <list>
#include <funct