LeetCode第 95 题:不同的二叉搜索树II(C++)

95. 不同的二叉搜索树 II - 力扣(LeetCode)

和这个类似,但是这儿需要把二叉树生成出来:
LeetCode第 96 题:不同的二叉搜索树(C++)_qq_32523711的博客-优快云博客

感觉自己处理这种问题还是不够熟练。。

明显使用递归嘛,序列为1, 2, … , n-1, n:

i i i ( i = 1 , 2 , 3... i = 1, 2,3... i=1,2,3...)为根节点,generateTrees(1,n)可由左子树集合generateTrees(1, i-1) 和 右子树generateTrees(i+1, n)里面分别选出一个,再和根节点 i i i 连接而成;而generateTrees(1, i-1)又可以像上一步一样继续分下去。

以上下界描述即为:
i i i ( l o w < = i < = h i g h low <= i <= high low<=i<=high)为根节点,generateTrees(low,high)可由左子树集合generateTrees(low, i-1) 和 右子树generateTrees(i+1, high)里面分别选出一个,再和根节点 i i i 连接而成,也就是把序列[low, high]分成了[low, i-1],[i+1, high]两部分,而 i 作为根节点

递归调用这两部分,一直划分下去,递归出口当 l o w > h i g h low > high low>high 的时候,返回空节点,那递归入口显然就是generateTrees(1, n)了。

class Solution {
public:
    vector<TreeNode*> generateTrees(int low, int high){
        if(low > high) return {NULL};
        vector<TreeNode*> allTrees;
        for(int i = low; i <= high; ++i){//以i为根节点
            auto l_trees = generateTrees(low, i-1); //左边部分生成的所有树集合
            auto r_trees = generateTrees(i+1, high); //右边部分生成的所有树集合
            for(const auto &left : l_trees){
                for(const auto &right : r_trees){
                    auto root = new TreeNode(i);
                    root->left = left;
                    root->right = right;
                    allTrees.push_back(root);
                }
            }
        }
        return allTrees;
    }
    vector<TreeNode*> generateTrees(int n) {
        if(n == 0) return vector<TreeNode*>();
        return generateTrees(1,n);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值