# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def generateTrees(self, n):
"""
:type n: int
:rtype: List[TreeNode]
"""
# defination:
# 返回一个 list<TreeNode>, 其中包含 [start, end] 这段序列的全部BST的root
def helper(start, end):
if start > end:
return [None]
# 以每个元素为root,分别生成左右全部组合,再组装
ret = []
for i in range(start, end + 1):
left = helper(start, i - 1)
right = helper(i + 1, end)
# 两两配对,组装
for l in left:
for r in right:
root = TreeNode(i)
root.left = l
root.right = r
ret.append(root)
return ret
if n == 0:
return []
return helper(1, n) class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) return new ArrayList<TreeNode>();
return helper(1, n);
}
// 返回所有start到end部分的BST的root
private List<TreeNode> helper(int start, int end) {
List<TreeNode> ret = new ArrayList<>();
if (start > end) {
ret.add(null);
return ret;
}
if (start == end) {
ret.add(new TreeNode(start));
return ret;
}
// 考虑 start到end 之间每个数字做root的情况
for (int i = start; i <= end; ++i) {
List<TreeNode> leftRoots = helper(start, i - 1);
List<TreeNode> rightRoots = helper(i + 1, end);
// 将左右的树穷举配对,以 i 为root 组成新的 tree,把 i 加入 ret
for (TreeNode leftRoot : leftRoots) {
for (TreeNode rightRoot : rightRoots) {
TreeNode root = new TreeNode(i);
root.left = leftRoot;
root.right = rightRoot;
ret.add(root);
}
}
}
return ret;
}
}class Solution {
vector<TreeNode*> helper(int left, int right) {
vector<TreeNode*> ret;
if (left > right) return ret;
else if (left == right) {
ret.push_back(new TreeNode(left));
return ret;
}
for (int i = left; i <= right; ++i) {
vector<TreeNode*> leftRoots = helper(left, i - 1);
vector<TreeNode*> rightRoots = helper(i + 1, right);
// 如果一边为空,为让循环继续,需要插入一个null
if (leftRoots.empty()) leftRoots.push_back(nullptr);
if (rightRoots.empty()) rightRoots.push_back(nullptr);
for (TreeNode* leftRoot : leftRoots) {
for (TreeNode* rightRoot : rightRoots) {
TreeNode* root = new TreeNode(i);
root->left = leftRoot;
root->right = rightRoot;
ret.push_back(root);
}
}
}
return ret;
}
public:
vector<TreeNode*> generateTrees(int n) {
return helper(1, n);
}
};