当前位置: 首页 > news >正文

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)

/**
 * 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);
    }
};

相关文章:

  • 设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan
  • RISC-V汇编学习(三)—— RV指令集
  • MySQL 5.7.40 主从同步配置教程
  • kettle工具使用从入门到精通(一)
  • 高效计算新篇章:探秘稀疏注意力如何颠覆传统Transformer
  • 从0开始,手搓Tomcat
  • 【Docker】通过 Docker 拉取 Python 镜像并设置远程连接(SSH)
  • 在K8S中,svc底层是如何实现的?
  • 基于SpringBoot的“文物管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 【无人机三维路径规划】基于CPO冠豪猪优化算法的无人机三维路径规划Maltab
  • 肖恩的n次根
  • 探秘 Threejs GUI:开启丝滑调试之旅
  • 探索DeepSeek:牛仔技术的未来在哪里?
  • android 支持自定义布局、线程安全、避免内存泄漏的 Toast 工具类
  • 用分页干掉显存浪费!聊聊VLLM的PagedAttention
  • Django系列教程(4)——实例项目任务管理小应用
  • MySQL复习笔记
  • 力扣 : 45. 跳跃游戏 II
  • BM25原理概述
  • redis数据类型以及底层数据结构
  • web服务器软件/百度谷歌seo优化
  • 中文企业网站设计欣赏/提高关键词排名的软文案例
  • 在哪个网站上做预收款报告/百度推广软件
  • 深圳社区网站开发公司/百度热门关键词
  • php动态网站怎么做/重庆企业免费建站
  • wordpress充值功能/seo应该怎么做