leetcode 95.不同的二叉搜索树 Ⅱ

首先分析一下什么是二叉搜索树。因为我本科学习数据结构的时候就是单纯背了一下题库,考试非常简单。现在额外补充学一些之前自己没有学过的内容。有序向量可以二分查找,列表可以快速插入和删除。二叉搜索树可以实现按照关键码访问。call by key .数据表现为词条,这可能和现实联系更加紧密。比如说,我们在 csdn 里面搜索信息,一般都是搜索关键字。然后我们学习,很可能也是第一反应是一些关键字。之前写的堆排序,感觉有点像二叉搜索树,但是好像是优先队列。我这压根就不是复习,是学习。呜呜呜。我太喜欢和别人交流具体知识点了,尤其是我擅长的东西。那些不擅长的东西,希望自己能尽快擅长起来。因为这真的比较重要。中序遍历可以把标准的二叉树垂直映射到 x 轴,所以二叉树的查找类似于向量的二分查找。中序遍历的顺序是左子树,根,右子树。这个就是,输入一个需要查找的元素 e ,然后 e 比当前遍历到的元素小,就遍历到左子树。假设 e 比当前的遍历到的元素大,就遍历到右子树。这里有一个前提,就是认为,左子树是更小的元素,右子树是更大的元素。太难了。不研究了。

直接在算法题里面体会得了。二叉搜索树要求左子树小于等于根节点,右子树大于等于右子树。能不能取到等号,问一下 deepseek 。标准的 bst 是不能取到等号的。

对于 n 个节点生成的二叉搜索树的数量是 catalan(n) ,感觉时间复杂度分析考试应该不会考,算了。不学了。算了,感觉可以记一下,深入研究比较有意思。生成一棵二叉搜索树需要线性的时间,总共有 catalan(n) 棵二叉搜索树,所以时间复杂度是 O(n*catalan(n)) , c a t a l a n ( n ) = ( 2 n ) ! n ! ( n + 1 ) ! catalan(n)=\frac{(2n)!}{n!(n+1)!} catalan(n)=n!(n+1)!(2n)! ,查了一下,是做了一个近似处理,然后得到的卡特兰数的增长速度,其实就是第 n 个卡特兰数的近似表示, 4 n n 3 2 ⋅ π \frac {4^n}{n^{\frac32} \cdot \sqrt{\pi}} n23⋅π 4n

数学公式这么写出来真帅啊!时间复杂度和空间复杂度均是 O ( 4 n n 1 2 ) O(\frac{4^n}{n^{\frac12}}) O(n214n)

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> generateTrees(int start,int end){
        if(start>end){
            return {nullptr};
        }
        vector<TreeNode*> allTrees;

        for(int i=start;i<=end;i++){
            vector<TreeNode*> leftTrees=generateTrees(start,i-1);
            vector<TreeNode*> rightTrees=generateTrees(i+1,end);

            for(auto& left:leftTrees){
                for(auto& right:rightTrees){
                    TreeNode* currTree=new TreeNode(i);
                    currTree->left=left;
                    currTree->right=right;
                    allTrees.emplace_back(currTree);
                }
            }
        }
        return allTrees;
    }

    vector<TreeNode*> generateTrees(int n) {
        if(!n){
            return {};
        }

        return generateTrees(1,n);
    }
};
相关推荐
☼←安于亥时→❦2 分钟前
PyTorch之张量创建与运算
人工智能·算法·机器学习
子豪-中国机器人17 分钟前
枚举算法和排序算法能力测试
开发语言·c++·算法
qiuyunoqy18 分钟前
基础算法之二分算法 --- 2
算法
1白天的黑夜129 分钟前
栈-844.比较含退格的字符串-力扣(LeetCode)
c++·leetcode·
重生之我是Java开发战士30 分钟前
【数据结构】Java集合框架:List与ArrayList
java·数据结构·list
爱干饭的boy1 小时前
手写Spring底层机制的实现【初始化IOC容器+依赖注入+BeanPostProcesson机制+AOP】
java·数据结构·后端·算法·spring
二哈不在线1 小时前
代码随想录二刷之“动态规划”~GO
算法·golang·动态规划
cellurw1 小时前
俄罗斯方块终端游戏实现 —— C语言系统编程与终端控制
c语言·算法
躲在云朵里`1 小时前
Redis深度解析:核心数据结构、线程模型与高频面试题
数据结构·数据库·redis
诸葛务农2 小时前
光电对抗:多模/复合制导中算法和软件平台
算法