96. 不同的二叉搜索树
1 class Solution 2 { 3 public: 4 int numTrees(int n) 5 { 6 //令G(n)表示n个节点二叉排序树的个数,f(i)表示以i作为根节点的二叉排序树的个数 7 //因此有:G(n) = f(1)+f(2)+f(3)+...+f(n) 8 //以i为根节点的左子树有i-1个节点,因此右子树有G(i-1)种二叉排序树 9 //右子树有n-i个节点,因此右子树有G(n-i)种二叉排序树 10 //从而得到:f(i) = G(i-1)*G(n-i) 11 //最后得到G(n) = G(0)*G(n-1)+G(1)G(n-2)+G(2)G(n-3)+...+G(n-1)G(0) 12 //因此得到G(i) = G(0)*G(i-1)+G(1)G(i-2)+G(2)G(i-3)+...+G(i-1)G(0) 13 // = 在(j=0,...,i-1)求和:(G[j] * G[i-1-j]) 14 vector<int> dp(n + 10,0); 15 dp[0] = 1;//当n为0时,只有一种:空树 16 for(int i = 1;i <= n;i ++) 17 { 18 for(int j = 0;j < i;j ++) 19 { 20 dp[i] += dp[j]*dp[i - j - 1]; 21 } 22 } 23 return dp[n]; 24 } 25 };
Mamba never out

浙公网安备 33010602011771号