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]​​中每个结点都能作为根节点生成左右子树

【LeetCode】不同的二叉搜索树 II_结点

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);
}
};