1 /* 2 先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1 3 4 若是有两个节点呢?咱们很天然想到,应该在f(1)的基础上考虑递推关系。那么,若是固定一个节点后,有两种状况,一是左子树还剩一个节点,此刻类型数量为f(1),第二种状况是右子树生一个节点,此刻类型数量为f(1),固有f(2) = f(1) + f(1) 5 6 若是有三个节点呢?咱们须要考虑固定两个节点的状况么?固然不行,为何? 7 8 由于当节点数量大于等于2时,不管你如何固定,其形态必然有多种,而在这多种基础之上你如何安排后续剩下的节点呢?因此必须挑出这个误区。 9 10 回到二叉树的定义,二叉树本质上就是一个递归的形式,左子树,右子树,根节点。因此根节点应该不变,须要递归处理的是左右子树。 11 12 也就是说,仍是考虑固定一个节点,即根节点。好的,按照这个思路,还剩2个节点,那么左右子树的分布状况为2=0+2=1+1=2+0。 13 14 因此有3个节点时,递归形式为f(3)=f(2) + f(1)*f(1) + f(2). (注意这里的乘法,由于左右子树一块儿组成整棵树,根据排列组合里面的乘法原理便可得出) 15 16 那么有n个节点呢?咱们固定一个节点,那么左右子树的分布状况为n-1=n-1 + 0 = n-2 + 1 = ... = 1 + n-2 = 0 + n-1 17 18 OK。递归表达式出来了f(n) = f(n-1) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1) 19 20 21 22 观察一下这个表达式,嗯,和咱们以前见过的递归表达有一点区别,递推层级为n的时候,更多的是考虑前一步(n-1),或者前两步(n-1)和(n-2)。 23 24 可是这里却考虑到全部的状况,即1到n-1。 25 26 最后说明一下,这个表达式有一个学名,叫作Catalan数。上面咱们没有定义f(0)。若是把f(0)也考虑进去,显然没有节点也只有一种状况,即f(0)=1 27 28 标准表达式为f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)f(0) 29 30 前几个数为1,1,2,5,14,42,132。 31 */