【LeetCode】不同的二叉搜索树 II

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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值