一棵二叉树有n个节点,问这颗二叉树的形态有多少种?
首先谈一下对递归的理解吧。当在原问题的所要求的那个量上面加上一个子时,所求原问题的算法跟所求的子问题的算法一样时,这样就可以用递归。像这道题,所求的是二叉树的形态有多少种,那么可以这样理解这颗二叉树的子二叉树的形态有多少种?,子二叉树我们可以瞬间理解成是左子树和右子树,所求的问题时二叉树的形态有多少种,那么这颗二叉树的左子树的形态有多少种,右子树的形态有多少种,由于根的形态只有一种,假设左子树有i个节点,那么算法是f,则左子树 的形态有f(i)种,右子树的形态有f(n-i)种,根据乘法原理可得f(n)=f(i)f(n-i);
最后说明一下,这个表达式有一个学名,叫做Catalan数。上面我们没有定义f(0)。如果把f(0)也考虑进去,显然没有节点也只有一种情况,即f(0)=1
标准表达式为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)
前几个数为1,1,2,5,14,42,132。
此外,还有一个通项公式为1/(n+1) * C(n, 2n) = C(n, 2n) - C(n-1, 2n) , n = 0,1,2,...