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 };

 

posted @ 2020-04-01 12:50  Jinxiaobo0509  阅读(86)  评论(0)    收藏  举报