题目描述:
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
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
BST的特点就是左边subtree的所有数值比root小,右边subtree的所有数值比root大。从中我们可以知道,假如让我们求n = 5的情况,那么对于1~5中任何一个值k来说,左边的subtree是1~k - 1组成的subtree,右边是k+1~5组成的subtree。那么如果能分别求出左右subtree的vectors,就可以得到答案了。
Mycode (AC = 22ms):
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @paramn n: An integer
* @return: A list of root
*/
vector<TreeNode *> generateTrees(int n) {
// write your code here
return generateTreesHelper(1, n);
}
vector<TreeNode *> generateTreesHelper(int start, int end) {
vector<TreeNode *> allTrees;
// if start > end, then just push the NULL tree
if (start > end) {
allTrees.push_back(NULL);
return allTrees;
}
// if start == end, one node tree
if (start == end) {
TreeNode *node = new TreeNode(start);
allTrees.push_back(node);
return allTrees;
}
// for each node i, the bst can be built by
// left tree (start ~ i - 1) and right tree (i + 1 ~ end)
for (int i = start; i <= end; i++) {
vector<TreeNode *> leftTrees = generateTreesHelper(start, i - 1);
vector<TreeNode *> rightTrees = generateTreesHelper(i + 1, end);
for (int j = 0; j < leftTrees.size(); j++) {
for (int k = 0; k < rightTrees.size(); k++) {
TreeNode *n = new TreeNode(i);
n->left = leftTrees[j];
n->right = rightTrees[k];
allTrees.push_back(n);
}
}
}
return allTrees;
}
};