Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public int val; 5 * public TreeNode left; 6 * public TreeNode right; 7 * public TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 12 private Dictionary<Tuple<int, int>, IList<TreeNode>> cache = new Dictionary<Tuple<int, int>, IList<TreeNode>>(); 13 14 public IList<TreeNode> GenerateTrees(int n) { 15 return DFS(1, n); 16 } 17 18 private IList<TreeNode> DFS(int start, int end) 19 { 20 var result = new List<TreeNode>(); 21 22 if (start > end) return result; 23 if (start == end) 24 { 25 result.Add(new TreeNode(start)); 26 return result; 27 } 28 29 var t = new Tuple<int, int>(start, end); 30 if (cache.ContainsKey(t)) return cache[t]; 31 32 for (int i = start; i <= end; i++) 33 { 34 var left = DFS(start, i - 1); 35 var right = DFS(i + 1, end); 36 37 if (left.Count == 0 || right.Count == 0) 38 { 39 if (left.Count == 0 && right.Count == 0) 40 { 41 result.Add(new TreeNode(i)); 42 } 43 else if (left.Count == 0) 44 { 45 foreach (var r in right) 46 { 47 var root = new TreeNode(i); 48 root.right = r; 49 result.Add(root); 50 } 51 } 52 else 53 { 54 foreach (var l in left) 55 { 56 var root = new TreeNode(i); 57 root.left = l; 58 result.Add(root); 59 } 60 } 61 } 62 else 63 { 64 foreach (var r in right) 65 { 66 foreach (var l in left) 67 { 68 var root = new TreeNode(i); 69 root.left = l; 70 root.right = r; 71 result.Add(root); 72 } 73 } 74 } 75 } 76 77 cache[t] = result; 78 79 return result; 80 } 81 }