CoderJesse  
wangjiexi@CS.PKU
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 };

 

posted on 2013-03-01 13:53  CoderJesse  阅读(136)  评论(0)    收藏  举报