LeetCode OJ 96. Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
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
我们观察一下BST的构成,对于任意一个节点,它的左子树上的所有值都比它小,它的右子树上的值都比它大。对于1···n,我们任选其中一个值i作为根节点,则小于i的有i-1个值,大于i的有n-1个值,因此对于以i为根节点这种情况,共计有numTrees(i-1)*numTrees(n-i)种可能。有了这种思路我们就可以递归求解。
但是这样的递归过程会重复做许多不必要的工作,例如n=5时,假设我们以3为根节点,会两次计算numTrees(2)。求一个大的值,我们会多次求解多个小的值,如果能把这些小值的解保存下来,就会节省很多时间。代码如下:
1 public class Solution { 2 public HashMap<Integer, Integer> map = new HashMap(); 3 public int numTrees(int n) { 4 map.put(0, 1); 5 map.put(1, 1); 6 if(map.containsKey(n)) return map.get(n); 7 8 int count = 0; 9 for(int i = 1; i<=n; i++){ 10 int left = map.containsKey(i-1)?map.get(i-1):numTrees(i-1); 11 int right = map.containsKey(n-1)?map.get(n-i):numTrees(n-i); 12 count += left*right; 13 } 14 map.put(n,count); 15 return count; 16 } 17 }