程序媛詹妮弗
终身学习

Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?

Input: 3
Output: 5
Explanation:
Given n = 3, there are a total of 5 unique BST's:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

 

题意:

给定n个节点,可形成多少种不同的BST

 

思路:

如果数组为空,毫无疑问,只有一种BST,即空树,          f(0) =1

如果数组仅有一个元素{1},只有一种BST,单个节点,       f(1) =1

如果数组有两个元素{1,2}, 那么有如下2种可能,                f(2)=2

1             2
  \          /
    2      1

                                                                              

如果数组有三个元素{1,2,3}, 那么有如下5种可能,             f(3)=5

 1       1           2          3       3
  \       \         / \        /       / 
   3       2       1   3      2       1
  /         \                /         \
2            3              1           2

由此得出规律,

对于任意以i为根节点的二叉树,

其左子树的值一定小于i,也就是[0, i - 1]区间,

而右子树的值一定大于i,也就是[i + 1, n]区间

假设左子树有m种排列方式,而右子树有n种,则对于i为根节点的二叉树总的排列方式就是m x n

f(2) = f(0) * f(1) + f(1) * f(0);
f(3) = f(0) * f(2) + f(1) * f(1) + f(2) * f(0);
f(4) = f(0) * f(3) + f(1) * f(2) + f(2) * f(1) + f(3) * f(0);
....
f(n) = f(0) * f(n-1) + f(1) * f(n-2) + ... + f(n-2) * f(1) + f(n-1) * f(0); 【卡特兰数(Catalan)】

 

 

代码:

 1 class Solution {
 2     public int numTrees(int n) {
 3         if(n < 1) return 0;    
 4         int[] dp = new int[n+1];
 5         dp[0] = 1;
 6         dp[1] = 1;
 7         for(int i = 2; i <= n; i++){
 8             for(int j = 0; j < i; j++){ 
 9                 dp[i] += dp[j] * dp[i - j - 1];
10             }    
11         } 
12         return dp[n];
13     }
14 }

 

 

 

posted on 2018-05-30 04:50  程序媛詹妮弗  阅读(330)  评论(0编辑  收藏  举报