0.总结
Get to the key point firstly, the article comes from LawsonAbs!
- N个节点的二叉树的形态数的推导
- 卡特兰数
- 相关例题的分析
1.问题
由N个节点构成的二叉树的形态数是多少。
例如,当n=1时,如下图所示,二叉树只有一种形态;
当n=2时,二叉树有2种形态。
那么 n 的值更一般的时候,是怎么推导的?
step 1.令 dp[i]
表示节点数为i时,其具有的形态个数;
step 2.根据常识有,dp[0] = 1; dp[1]=1;
没有节点或者只有一个节点时,都是1。现在就以n=3为例,推一下n=3时的情形。考虑如何放这三个节点,分步骤来操作:
固定一个根节点,再将剩余的节点放到左右两个子树中。那么 dp[3]
就是这些方法的总和。放根节点的方法只有一个,那么问题就是放剩余的两个节点的方法有多少种?可以像下面这么安排:
-
左子树放2个,右子树放0个;
公式也就是
dp[1]*dp[2]*dp[0] = 2
【dp[1]表示根节点是1个节点时的形态数目; dp[2]表示的是左子树有两个节点时的形态数目;dp[0]表示的是右子树有0个节点时的形态数目】 -
左子树放1个,右子树放1个;
公式:
dp[1]*dp[1]*dp[1] = 1
【dp[1]表示根节点是1个节点时的形态数目; dp[1]表示的是左子树有1个节点时的形态数目;dp[1]表示的是右子树有1个节点时的形态数目】
- 左子树放0个,右子树放2个;
公式:
dp[1]*dp[0]*dp[2] = 2
【dp[1]表示根节点是1个节点时的形态数目; dp[0]表示的是左子树有0个节点时的形态数目;dp[2]表示的是右子树有2个节点时的形态数目】
上述三个公式的和就是dp[3]
。因为dp[1]=1,所以可以省去不写。
…
以此类推,那么得到的结果就是dp[n] = dp[0]*dp[n-2] + dp[1]*dp[n-1] +.... + dp[n-1]*dp[1] + dp[n-2]*dp[0]
。这个式子也就是著名的卡特兰数。