LeetCode—96. Unique Binary Search Trees
题目
https://leetcode.com/problems/unique-binary-search-trees/
一个有n个节点的二叉搜索树,有多少种不同的结构。
思路及解法
二叉搜索树:对于任意一个节点root,其左子树中的元素小于root,其右子树中的元素大于root。二叉搜索树的中序遍历是非递减的。
解决这道题需要知道,二叉搜索树的性质,就是二叉搜索树的不同结构个数是卡塔兰数。卡塔兰数的通过动态规划计算。卡塔兰数的递推公式如下:
下面我们举例子说明如何计算:
dp[i]表示有i个节点的二叉搜索树不同结构数。
1.空树可以认为是一个二叉搜索树,所以dp[0]=1
2.只有根节点的二叉搜索树只有一种结构,dp[1]=1
3.当n=2时,
- 以1为根节点,左子树深度0,右子树深度1,结构数=dp[0]*dp[1]
- 以2为根节点,左子树深度1,右子树深度0,结构数=dp[1]*dp[0]
总的结构数就是求和
4.当n=3时,
- 以1为根节点,左子树深度0,右子树深度2,结构数=dp[0]*dp[2]
- 以2为根节点,左子树深度1,右子树深度1,结构数=dp[1]*dp[1]
- 以3为根节点,左子树深度2,右子树深度0,结构数=dp[2]*dp[0]
总的结构数就是求和
所以dp[n]就符合上面卡塔兰数的递推公式。
代码
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i=2; i<=n; i++){
for(int j=0; j<i; j++){
dp[i] += dp[i-j-1]*dp[j];
}
}
return dp[n];
}
}