【杂谈】n个节点能组成多少个不同的二叉树
使用递归的思想解决这个问题
简单的例子:
当n=0时,没有树,为0
s(0)=0
当n=1时,显然
s(1)=1
当n=2时,一个根节点一个节点在左枝上,或者一个根节点一个节点在右枝上
s(2)=2
当s=3时,有根节点,然后左2右0,2种情况;左1右1,1种情况;左0右2,2种情况
s(3)=5
利用求s(3)的思想,求s(n)时,相当于一个根节点,然后左边 i 个节点组成一个二叉树,右边 j 个节点组成一个二叉树,
并且满足 i+j+1 = n,这样就得到递推公式:
s(n) = s(0)*s(n-1) + s(1)*s(n-2) + s(2)*s(n-3) + ...... + s(n-2)*s(1) + s(n-1)*s(0)
其中,定义s(0)=1,因为一边没有节点也算一种情况。
可以用cpp代码解决这个问题:
int n_tree(int n) { int save[n+1]; save[0] = 1; save[1] = 1; save[2] = 2; for (int i = 3; i <= n; i++) { save[i] = 0; for (int j = 0; j <= i-1; j++) save[i] += save[j]*save[i-j-1]; } return save[n]; }
根据递推公式,可以解出通解
s(n)=C(2n,n)/(n+1)
称之为catalan数,对此不做过多分析。