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);
    }
};
相关推荐
yadanuof1 分钟前
leetcode hot100 图论
leetcode·深度优先·图论
ianozo18 分钟前
数据结构--【栈与队列】笔记
数据结构·笔记
---yx89897827 分钟前
数字人系统源码---v10技术五大底层架构链路全局开发思路
算法·架构·数字人·数字人源码·数字人系统
xiao--xin33 分钟前
LeetCode100之二叉搜索树中第K小的元素(230)--Java
java·算法·leetcode·二叉树·树的统一迭代法
路飞雪吖~35 分钟前
数据结构 && 常见的排序算法
数据结构·算法·排序算法
手握风云-39 分钟前
Java数据结构第二十一期:解构排序算法的艺术与科学(三)
数据结构·算法·排序算法
爱吃柠檬呀1 小时前
《C陷阱与缺陷》读书笔记(一)
c语言·开发语言·算法·《c陷阱与缺陷》·编写程序
壮志凌云1 小时前
配对样本t检验
算法
wxr的理想之路2 小时前
list链表的使用
c语言·数据结构·链表·list
fqsword2 小时前
C++ 算法竞赛STL以及常见模板
c++·算法