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);
    }
};
相关推荐
做怪小疯子1 小时前
LeetCode 热题 100——子串——和为 K 的子数组
算法·leetcode·职场和发展
zl_vslam2 小时前
SLAM中的非线性优-3D图优化之李群李代数在Opencv-PNP中的应用(四)
人工智能·opencv·算法·计算机视觉
Run_Teenage4 小时前
C++:智能指针的使用及其原理
开发语言·c++·算法
mit6.8246 小时前
二维差分+前缀和
算法
民乐团扒谱机6 小时前
自然的算法:从生物进化到智能优化 —— 遗传算法的诗意与硬核“
算法
希望有朝一日能如愿以偿6 小时前
力扣每日一题:仅含1的子串数
算法·leetcode·职场和发展
漂流瓶jz6 小时前
SourceMap数据生成核心原理:简化字段与Base64VLQ编码
前端·javascript·算法
今天的砖很烫6 小时前
ThreadLocal 中弱引用(WeakReference)设计:为什么要 “故意” 让 Key 被回收?
jvm·算法
苏小瀚7 小时前
算法---FloodFill算法和记忆化搜索算法
数据结构·算法·leetcode
苏小瀚7 小时前
算法---二叉树的深搜和回溯
数据结构·算法