Unique Binary Search Trees

来源:互联网 发布:数学建模优化方法模型 编辑:程序博客网 时间:2024/06/03 21:32

设C0 = 1,只有一个元素时可行的BST数量C1 = 1,有两个元素时可行的BST数量C2 = 2 ,C3 = C0*C2 + C1*C1 + C2*C0 , C4 =......

这就是卡特兰数的定义。

所以用动态规划来做。

然而这种规律太难找了,我更倾向于寻找有启发性的思路。

因为对于每一个节点,只有两种状态:作为根节点或不作为根节点,有二分的思想,然而很明显这道题不能用二分法做,同时想到二分法和动态规划的相似点(见我的另一篇博客http://blog.csdn.net/popvip44/article/details/51704994),所以考虑用动态规划来做。

即:

n == 0 时,空树的个数必然为1,因此dp[0] = 1 
n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1 
n == 2时,有两种构造方法,dp[2] = dp[0] * dp[1] + dp[1] * dp[0] (0为根节点,1为根节点)
n == 3时,dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0] (0为根节点,2为子树根节点或者不为子树根节点; 1为根节点,因为1是mid位置,所以只有一种结构; 2为根节点,0为或不为子树根节点)

由卡特兰数计算公式得:

class Solution {public:    int numTrees(int n) {if (n <= 0)return 0;if (n == 1)return 1;vector<int> res(n+1,0) ;res[0]=1;res[1]=1;for (int i = 2; i <=n; i++){for (int j = 0; j<i; j++){res[i] += res[j] * res[i - j-1];}}return res.back();    }};


0 0
原创粉丝点击