【综合笔试题】难度 1.5/5,常规二叉树爆搜题

news2025/1/18 13:52:06

题目描述

这是 LeetCode 上的 95. 不同的二叉搜索树 II ,难度为 中等

Tag : 「树」、「二叉搜索树」、「BST」、「DFS」、「递归」、「爆搜」

给你一个整数 n,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:

输入:n = 3

输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
复制代码

示例 2:

输入:n = 1

输出:[[1]]
复制代码

提示:

  • 1 <= n <= 81<=n<=8

回溯算法

题目要我们求所有所能构造的二叉搜索树的具体方案,而给定 nn 个节点所能构成的二叉搜索树的个数为 卡特兰数。

其他方案数同为卡特兰数的还包括:凸多边形三角划分、n 对括号正确匹配数目 ...

回到本题,根据二叉搜索搜索的特性,若某个子树的根节点为 root,那么 root 的左子树任意节点值均比 root.val 要小,root 的右子树任意节点值均比 root.val 要大。

因此,假设我们使用 [l, r][l,r] 连续段来构造二叉搜索树,并且选择了节点 t 作为二叉搜索树的根节点时,那么使用 [l, t - 1][l,t−1] 构造出来的二叉搜索树均可作为根节点 tt 的左子树;同理,使用 [t + 1, r][t+1,r] 构造出来的二叉搜索树均可作为根节点 t 的右子树。

也就是说,我们可以设计递归函数 List<TreeNode> dfs(int l, int r),含义为使用连续段 [l, r][l,r] 进行二叉搜索树构造,并返回相应集合。

最终答案为 dfs(1, n),起始我们可以枚举 [1, n][1,n] 范围内的的每个数 t 作为根节点,并递归 dfs(l, t - 1) 和 dfs(t + 1, r) 获取左右子树的集合 left 和 right,结合「乘法原理」,枚举任意左子树和任意右子树,即可得到 t 作为根节点的二叉搜索树方案集,枚举所有 t 后即可得到所有二叉搜索树的总集。

注意:当我们运用乘法原理,来构造以 t 为根节点的二叉搜索树时,其 left 或 right 某一边可能为空集,但此时我们仍要将非空的一边子树进行挂载。 为了确保两层新循环的逻辑会被执行,对于空集我们不能使用 null 来代指,而要使用 [null] 来代指。

Java 代码:

class Solution {
    public List<TreeNode> generateTrees(int n) {
        return dfs(1, n);
    }
    List<TreeNode> dfs(int l, int r) {
        if (l > r) return new ArrayList<>(){{add(null);}};
        List<TreeNode> ans = new ArrayList<>();
        for (int i = l; i <= r; i++) {
            for (TreeNode x : dfs(l, i - 1)) {
                for (TreeNode y : dfs(i + 1, r)) {
                    TreeNode root = new TreeNode(i);
                    root.left = x; root.right = y;
                    ans.add(root);
                }
            }
        }
        return ans;
    }
}
复制代码

TypeScript 代码:

function generateTrees(n: number): Array<TreeNode | null> {
    function dfs(l: number, r: number): Array<TreeNode | null> {
        if (l > r) return [null]
        const ans = new Array<TreeNode>()
        for (let i = l; i <= r; i++) {
            for (const x of dfs(l, i - 1)) {
                for (const y of dfs(i + 1, r)) {
                    const root = new TreeNode(i)
                    root.left = x; root.right = y
                    ans.push(root)
                }
            }
        }
        return ans
    }
    return dfs(1, n)
}
复制代码

Python 代码:

class Solution:
    def generateTrees(self, n: int) -> List[Optional[TreeNode]]:
        def dfs(l, r):
            if l > r:
                return [None]
            ans = []
            for i in range(l, r + 1):
                for x in dfs(l, i - 1):
                    for y in dfs(i + 1, r):
                        root = TreeNode(i)
                        root.left, root.right = x, y
                        ans.append(root)
            return ans
        return dfs(1, n)
复制代码
  • 时间复杂度:卡特兰数
  • 空间复杂度:卡特兰数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022出圈的ML研究:爆火的Stable Diffusion、通才智能体Gato,LeCun转推

这些机器学习领域的研究你都读过吗&#xff1f; 2022 年即将步入尾声。在这一年里&#xff0c;机器学习领域涌现出了大量有价值的论文&#xff0c;对机器学习社区产生了深远的影响。 今日&#xff0c;ML & NLP 研究者、Meta AI 技术产品营销经理、DAIR.AI 创始人 Elvis S.…

CSRF漏洞渗透与攻防(一)

目录 前言 什么是CSRF漏洞 CSRF实现流程 CSRF漏洞危害 XSS漏洞危害 CSRF与XSS区别 CSRF分类 GET型&#xff1a; POST型&#xff1a; CSRF漏洞案列模拟 CSRF常用Payload&#xff1a; CSRF漏洞挖掘 检测工具 CSRF漏洞防御 防御思路 我们该如何去防御CSRF漏洞…

LeetCode动态规划—打家劫舍从平板板到转圈圈(198、213)

打家劫舍平板板打家劫舍转圈圈打家劫舍&#xff08;进阶版&#xff09;平板板打家劫舍 转化子问题&#xff1a; 按顺序偷n间房子&#xff0c;就是考虑偷前n-1间房子还是偷前n-2间房子再偷第n间房子。 列出公式&#xff1a; res[n] max{ res[n-1] , 数组中最后一个数据res[n-…

企业信息化之源代码防泄密场景分析

场景描述 随着企业信息化发展迅速&#xff0c;越来越多的无形资产面临着被泄露&#xff0c;被盗取的&#xff0c;或员工无意导致的数据泄密风险。尤其是有源码开发的企业&#xff0c;源代码的安全更是重中之重&#xff0c;一旦泄密&#xff0c;有可能给企业带来不可估量的损失…

全程数字化的企业电子招标采购管理系统源码

全程数字化的采购管理 智能化平台化电子化内外协同 明理满足采购业务全程数字化&#xff0c; 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 传统采购模式面临的挑战 如何以最合适的价格,找到最优的供应商,购买到最好的产品和服务?…

程序员必备网站,建议收藏!

俗话说的好&#xff0c;一个程序员&#xff0c;20%靠知识储备&#xff0c;80%靠网络搜索。 打开代码&#xff0c;打开Google&#xff0c;开始工作。 那么常用的写码软件&#xff0c;你知道几个呢&#xff1f; 下面我们来一起看一下常用的写码软件吧~ 建议收藏本文&#xff…

【算法】面试题 - 链表

链表相关面试题141. 环形链表问题&#xff1a;快慢指针为什么一定会相遇142. 环形链表 II问题&#xff1a;如何确认入口160. 相交链表237. 删除链表中的节点19. 删除链表的倒数第 N 个结点21. 合并两个有序链表23. 合并K个升序链表&#xff08;两种解法&#xff09;扩展&#x…

国产手机扬眉吐气,终于打击了苹果的嚣张气焰

苹果在9月份、10月份都取得了快速增长&#xff0c;而国产手机品牌持续下滑&#xff0c;但是11月份终于让国产手机捡回了主动权&#xff0c;11月份的数据显示有国产手机品牌的出货量大幅增长&#xff0c;而苹果的出货量却大幅下滑&#xff0c;国产手机成功反击了苹果。分析机构给…

Vue + SpreadJS 实现高性能数据展示与分析

Vue SpreadJS 实现高性能数据展示与分析 在前端开发领域&#xff0c;表格一直都是一个高频使用的组件&#xff0c;尤其是在中后台和数据分析场景下。但当一屏展示数据超过1000条数据记录时&#xff0c;会出现浏览器卡顿等问题&#xff0c;严重影响客户体验。为解决这些性能问…

Seay代码审计系统审计实战

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Seay代码审计系统审计实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

【算法题解】5. 删除有序数组中的重复项 + 移动零

文章目录删除有序数组中的重复项题目解题思路代码实现复杂度分析移动零题目解题思路代码实现复杂度分析删除有序数组中的重复项 题目 给你一个 升序排列 的数组 nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次 &#xff0c;返回删除后数组的新…

Python 并发编程实战,用多线程、多进程、多协程加速程序运行

Python 并发编程实战&#xff0c;用多线程、多进程、多协程加速程序运行 文章目录Python 并发编程实战&#xff0c;用多线程、多进程、多协程加速程序运行1、什么是CPU密集型计算、IO密集型计算&#xff1f;2、多线程、多进程、多协程的对比3、怎么根据任务选择对应技术&#x…

达梦数据成功过会!信创浪潮中如何成就一家国产龙头?

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业2022年12月22日&#xff0c;上海证券交易所科创板上市委员会发布《2022年第110次审议会议结果公告》&#xff0c;武汉达梦数据股份有限公司&#xff08;首发&#xff09;符合发行条件、上市条件和信息披露要求。该公告标志着…

5.4 迭代语句

文章目录while语句使用while循环传统for语句传统for循环的执行过程for语句头中的多重定义省略for语句头的某些部分范围for语句do while语句迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体之前检查条件&#xff0c;do while 语句先执…

MATLAB算法实战应用案例精讲-【连接分析】PageRank(补充篇)(附Python代码实现)

前言 PageRank算法在1998年4月举行的第七届国际万维网大会上由Sergey Brin和Larry Page提出。PageRank是通过计算页面链接的数量和质量来确定网站重要性的粗略估计。算法创立之初的目的是应用在Google的搜索引擎中,对网站进行排名。 随着国内外学者的深入研究,PageRank算法…

burpsuite靶场——SSRF

文章目录针对本地服务器的基本 SSRF针对另一个后端系统的基本 SSRFSSRF 与基于黑名单的输入过滤器基于白名单的输入过滤器的 SSRFSSRF 通过开放重定向漏洞绕过过滤器带外检测的盲 SSRF利用 Shellshock 的盲 SSRF针对本地服务器的基本 SSRF 在商品下查看货物库存情况时抓包 有st…

操作系统实验2:fork()系统调用

操作系统实验2:fork()系统调用 文章目录操作系统实验2:fork()系统调用Task1: fork的基本使用代码运行结果解释Task2: 深入理解fork创建的子进程与父进程的关系代码实验结果现象解释遇到的问题1.乌龙事件 vscode2.the troubles encountered in task1如何跑.sh文件编译链接遇到的…

SegeX Progress:MFC通用进度条

----哆啦刘小洋 原创&#xff0c;转载需说明出处 MFC高级通用进度条-目录1 简介2 进度条实现基本原理3 使用方法3 .1 简单情况3.2 两个前后独立的进度条3.3 实际应用的一般情况3.4 带子进度条4 其他4.1 使用限制4.2 其他全局宏&#xff08;函数&#xff09;4.3 当前进度条设置1…

技术开发107

技术开发107 业务内容&#xff1a; 汽车音响等汽车电子部件试制、电子设备部件试制、精密钣金试制精密钣金试制 公司简介&#xff1a; 代表&#xff1a;中山尚美 成立时间&#xff1a;1950年6月 资本金&#xff1a;1000万日元 员工数&#xff1a;15名 资格认证&#xff…

数智为线,经纬中国:新华三勾勒出的山河锦绣

刺绣&#xff0c;是中华民族源远流长的技艺美术。早在《尚书》中&#xff0c;就记载了章服制度“衣画而裳绣”。而刺绣之美之所以能够传承千年&#xff0c;形成中国审美的一张名片&#xff0c;就是因为传统的染色技艺不够精细&#xff0c;颜色常常浮在布匹表面&#xff0c;但刺…