Given 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
不算难题,但写起来还是有点复杂。需要用动规记录下总节点为i(i<=n)时的全部树。
1 /**
2 * Definition for binary tree
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8 * };
9 */
10 class Solution {
11 public:
12 vector<TreeNode *> generateTrees(int n) {
13 // Start typing your C/C++ solution below
14 // DO NOT write int main() function
15 if(n == 0)
16 {
17 vector<TreeNode *> ans;
18 ans.push_back(NULL);
19 return ans;
20 }
21 vector<TreeNode *> **v;
22 v = new vector<TreeNode *>* [n+1];
23 for(int i = 0; i < n+1;i++)
24 {
25 v[i] = new vector<TreeNode *>[n+1];
26 v[i][i].push_back(new TreeNode(i));
27 }
28 int l = 0,r = 0;
29 int l1 = 0,r1 = 0;
30 for(int i = 2;i <= n;i++)
31 for(int j = 1;j <= n - i +1;j++)
32 {
33 for(int k = j;k <= j+i-1;k++)
34 {
35 TreeNode *tmp = new TreeNode(k);
36 l = j;r = k-1;
37 l1 = k+1;r1 = j+i-1;
38 if(r>=l)
39 {
40 for(int t = 0;t < v[l][r].size();t++)
41 {
42 tmp->left = v[l][r].at(t);
43 if(l1 > r1)
44 {
45 TreeNode *tn = new TreeNode(tmp->val);
46 tn->left = tmp->left;
47 tn->right = tmp->right;
48 v[j][j+i-1].push_back(tn);
49 }
50 else
51 {
52 for(int s = 0;s < v[l1][r1].size();s++)
53 {
54 tmp->right = v[l1][r1].at(s);
55 TreeNode *tn = new TreeNode(tmp->val);
56 tn->left = tmp->left;
57 tn->right = tmp->right;
58 v[j][j+i-1].push_back(tn);
59 }
60 }
61 }
62 }
63 else
64 {
65 for(int s = 0;s < v[l1][r1].size();s++)
66 {
67 tmp->right = v[l1][r1].at(s);
68 TreeNode *tn = new TreeNode(tmp->val);
69 tn->left = tmp->left;
70 tn->right = tmp->right;
71 v[j][j+i-1].push_back(tn);
72 }
73 }
74 }
75 }
76 return v[1][n];
77 }
78 };