【LeetCode】不同的二叉搜索树 II
原创
©著作权归作者所有:来自51CTO博客作者BugMaker999的原创作品,请联系作者获取转载授权,否则将追究法律责任
95. 不同的二叉搜索树
二叉搜索树关键的性质是根节点的值大于左子树所有节点的值,小于右子树所有节点的值,且左子树和右子树也同样为二叉搜索树。而左子树和右子树的生成相较于原问题是一个序列长度缩小的子问题,我们可以通过控制区间大小,使用递归函数完成
对于连续整数序列[left, right]
中的一点 i,若要生成以i为根节点的BST,有如下规律:
i左边的序列可以作为左子树结点,且左儿子可能有多个,所以有:
vector<TreeNode *> left_trees = generate(left, i - 1)
i右边的序列可以作为右子树结点,同上所以有:
vector<TreeNode *> right_trees = generate(i + 1, right);
如果当前left > right
,说明当前区间不能生成BST树,返回{nullptr}
产生的以当前i
为根结点的BST(子)树有left_trees.size() * right_trees.size()
个,两个for遍历每种情况,即可生成以i为根节点的BST序列;
然后以for循环使得[left, right]
中每个结点都能作为根节点生成左右子树

class Solution {
public:
// 返回以[left, right]每个数为根节点的BST,一个元素表示一个BST
vector<TreeNode*> generate(int left, int right){
if(left > right) return {nullptr};
vector<TreeNode*> ans;
for(int i = left; i <= right; i++){
vector<TreeNode*> l_trees = generate(left, i - 1);
vector<TreeNode*> r_trees = generate(i + 1, right);
for(TreeNode* l_tree : l_trees){
for(TreeNode* r_tree : r_trees){
TreeNode* root = new TreeNode(i, l_tree, r_tree);
ans.emplace_back(root);
}
}
}
return ans;
}
vector<TreeNode*> generateTrees(int n) {
return generate(1, n);
}
};