Leetcode 95: Unique Binary Search Trees II

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 }

 

posted @ 2017-11-15 04:02  逸朵  阅读(123)  评论(0编辑  收藏  举报