Leetcode 中等:95. 不同的二叉搜索树II

【中等】力扣算法题解析LeetCode95:不同的二叉搜索树 II 本文介绍了生成所有可能二叉搜索树(BST)的算法。利用BST的性质,通过分治策略递归构建左右子树,并采用二维数组缓存优化避免重复计算。算法处理边界条件(空子树和单节点),双重循环组合子树结构,最终返回所有可能的BST。Java实现中,使用数组缓存替代哈希表提升效率,并通过惰性初始化减少内存占用。该解法时间复杂度为指数级(卡特兰数),但因缓存优化实际运行效率较高,适用于n≤8的情况。 阅读详情

题目:不同的二叉搜索树II

  • 题号:95
  • 难度:中等
  • https://leetcode-cn.com/problems/unique-binary-search-trees-ii/

给你一个整数 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 <= 8

实现

思路:递归。

如果将i作为根节点,那么[1, i-1]为i的左子树节点,[i+1, n]为右子树节点。

问题就被拆分为两个子问题了:

  • 求左区间构成的所有二叉搜索树作为i的左子树
  • 求右区间构成的所有二叉搜索树作为i的右子树

递归终止条件:

  • 区间为空,返回null。
  • 区间的左右端点相同,即只包含一个数,返回该数构成的根结点。

以上就是利用递归求解该问题的思路。

C# 语言

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
 
public class Solution
{
    public IList<TreeNode> GenerateTrees(int n)
    {
        if (n == 0)
        {
            return new List<TreeNode>();
        }
        return GenerateTrees(1, n);
    }
    
    public List<TreeNode> GenerateTrees(int start, int end)
    {
        List<TreeNode> lst = new List<TreeNode>();
        //此时没有数字,将 null 加入结果中
        if (start > end)
        {
            lst.Add(null);
            return lst;
        }
        //只有一个数字,当前数字作为一棵树加入结果中
        if (start == end)
        {
            TreeNode tree = new TreeNode(start);
            lst.Add(tree);
            return lst;
        }
        //尝试每个数字作为根节点
        for (int i = start; i <= end; i++)
        {
            //得到所有可能的左子树
            List<TreeNode> leftTrees = GenerateTrees(start, i - 1);
            //得到所有可能的右子树
            List<TreeNode> rightTrees = GenerateTrees(i + 1, end);
            //左子树右子树两两组合
            foreach (TreeNode leftTree in leftTrees)
            {
                foreach (TreeNode rightTree in rightTrees)
                {
                    TreeNode root = new TreeNode(i);
                    root.left = leftTree;
                    root.right = rightTree;
                    //加入到最终结果中
                    lst.Add(root);
                }
            }
        }
        return lst;
    }
}

Python 语言

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution(object):
    def generateTrees(self, n):
        """
        :type n: int
        :rtype: List[TreeNode]
        """
        if n == 0:
            return list()
        return self.generate(1, n)
    
    def generate(self, start, end):
        lst = list()
        if start > end:
            lst.append(None)
            return lst
            
        if start == end:
            tree = TreeNode(start)
            lst.append(tree)
            return lst
            
        for i in range(start, end + 1):
            leftTrees = self.generate(start, i - 1)
            rightTrees = self.generate(i + 1, end)
            for leftTree in leftTrees:
                for rightTree in rightTrees:
                    tree = TreeNode(i)
                    tree.left = leftTree
                    tree.right = rightTree
                    lst.append(tree)
        return lst
LobeHub开源AI应用平台:从部署到定制的全栈实践指南 在现代AI应用开发领域,大语言模型(LLM)的集成与部署是核心技术挑战之一。其原理在于通过API或本地化部署,将预训练模型的强大能力封装为可调用的服务。这项技术的核心价值在于极大地降低了AI应用的开发门槛,使开发者能够快速构建智能对话、内容生成等场景的应用。随着模型即服务(MaaS)模式的普及,一个关键痛点是如何高效地管理多模型、设计友好的用户界面并实现功能扩展。这正是开源项目LobeHub所聚焦的领域,它通过提供可插拔的架构和配置驱动的低代码理念,解决了AI能力落地的“最后一公里”问题。本文将结合Dock 阅读详情

相关推荐

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3559

leetcode 95: 不同的二叉搜索树

leetcode 95: 不同的二叉搜索树 给你一个整数 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 <= 8 Related Topics 树 二叉搜索树

yingmu__的博客 1220

原神真端,原神服务端,虚拟机启动部署傻瓜式教学

没玩过抽卡 游戏想体验一下抽卡的感觉,听说原神有真端了,所以弄一个局域网的服务体验一下,这里要感谢一些服务端的分享者。

azyouyouyou的博客 1万+

【LeetCode】C++ :中等题 - 树 95. 不同的二叉搜索树 II

95. 不同的二叉搜索树 II 难度中等776 给定一个整数n,生成所有由 1 ...n为节点所组成的二叉搜索树。 示例: 输入:3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / ...

weixin_44566432的博客 150

分布式存储系统关于GDPR条例中的数据清除原则

文章目录前言HDFS存储系统数据的完全删除基于加解密的输入输出流的数据保护方案 前言 关于GDPR是什么,可能许多同学之前并不太了解,至少笔者在之前也是不清楚的。GDPR全称为通用数据保护条例,General Data Protection Regulation。它是一项来自欧盟的关于计算机数据保护相关的条约,旨在规范系统如何收集,管控用户私人数据的种种行为。但是当前的一些存储系统并没有完全符合...

走在前往架构师的路上 3623

别再翻手册了!用Materials Studio的Forcite模块,5步搞定复杂溶剂的溶解度参数计算

本文详细介绍了如何使用Materials Studio的Forcite模块,通过5个步骤快速计算复杂溶剂的溶解度参数。从分子建模、结构优化到分子动力学采样,再到最终的内聚能密度计算,该方法大幅提升了石油化工和高分子材料研发中的效率,避免了传统手册查阅和实验的繁琐过程。

weixin_28707739的博客 280

力扣第95题 不同的二叉搜索树 II

给你一个整数 ,要求生成所有由 到 为节点所组成的 不同的二叉搜索树,并返回这些树的根节点。 参数含义 : 当前生成树的节点值范围的起始值。 : 当前生成树的节点值范围的结束值。 : 用于返回生成的树的数量。 返回值 返回所有可能的 BST(以数组形式表示,数组中的每个元素是 BST 的根节点指针)。 当 时,不存在可用节点,这表示一种有效的情况:返回空树。 这种情况允许更高层的递归在左右子树组合时将 作为子树。 枚举每个节点作为根节点: 遍历 范围内的每个数字,将其作为当前树的

weixin_48941116的博客 1402

实战经验:Sensor Bringup中那些坑我都帮你踩过了(避坑指南)

本文是一份详尽的Sensor Bringup实战避坑指南,总结了从I2C通信、MCLK时钟、电源管理到图像异常等关键环节的常见问题与排查方法。文章提供了系统化的调试工作流,强调先硬件后软件的排查原则,旨在帮助硬件工程师快速定位并解决Sensor启动过程中的难题,提升开发效率。

weixin_29212429的博客 574

LeetCode第95题_不同的二叉搜索树II

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

qq_40263592的博客 1326

手把手教你用ADS优化肖特基二极管检波电路(附RC参数避坑指南)

本文详细介绍了如何使用ADS软件优化肖特基二极管检波电路,包括RC参数设置、常见失真问题分析与解决方案。通过实战案例和参数优化技巧,帮助射频工程师避免设计陷阱,提升电路性能。特别附有RC参数避坑指南,适用于调幅解调、功率检测等应用场景。

m2n3o4p5的博客 198

DDR4协议规范之(一)DDR4结构和寻址

DDR4 SDRAM结构和寻址DDR4 SDRAM的封装和寻址新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 DDR4 SDRAM的封装和寻址 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习

YJFeiii的博客 3万+

【LeetCode每日一题】——95.不同的二叉搜索树 II

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

IronmanJay 1349

Unidbg补环境实战:复现Shopee风控Native层运行环境

Android App风控已从HTTP层签名校验,演进为深度依赖Native层系统调用与硬件特征的多维验证。其核心原理在于通过JNI桥接Java与Native代码,调用openat、sysconf、getrandom等系统接口读取/proc、/sys、/dev等路径的真实状态,并结合SELinux策略、CPU拓扑、分区哈希等硬性指标构建设备可信画像。这种技术架构显著提升了对抗黑灰产的能力,但也对逆向分析与自动化调用提出更高要求——必须精准模拟底层环境而非仅Hook逻辑。Unidbg补环境正是为此而生:它支持

weixin_30533109的博客 636

LeetCode 95. 不同的二叉搜索树 II | Python

文章目录95. 不同的二叉搜索树 II题目解题思路代码实现实现结果欢迎关注 95. 不同的二叉搜索树 II 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/unique-binary-search-trees-ii 题目 给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。 示例: 输入:3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3],

"大梦三千秋的博客 1100

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java实现 LeetCode 95 不同的二叉搜索树 II(二)

95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 ...

南 墙 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

95不同的二叉搜索树II

一、前言 分类:动态规划。 问题来源LeetCode 95 难度:中等。 问题链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 二、题目 给定一个整数n,生成所有由 1 ...n为节点所组成的二叉搜索树。 示例: 输入:3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null...

行走 430

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

力扣 95. 不同的二叉搜索树 II

力扣 每日一题 7.21 https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ package com.leetCode; import java.util.LinkedList; import java.util.List; /** * @author cyt * @create 2020-07-21 下午 11:30 */ public class T95 { public List<TreeNode&

cyt 249

算法leetcode|95. 不同的二叉搜索树 II(多语言实现)

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

二当家的白帽子 1743

leetcode:95. 不同的二叉搜索树 II

题目来源 95. 不同的二叉搜索树 II 题目描述 题目解析 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, Tre

OceanStar的博客 409

Leetcode95. 不同的二叉搜索树 II

Leetcode95. 不同的二叉搜索树 II 题目: 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 ...

会流泪de鱼的博客 200

Leetcode95. 不同的二叉搜索树 II(C语言)

Leetcode95. 不同的二叉搜索树 II(C语言) 算法-分治:算法与数据结构参考 题目: 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树1。例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜...

jeanlu的博客 1521

leetcode95不同的二叉搜索树II

leetcode95不同的二叉搜索树II1、题目描述2、解题思路3、代码 1、题目描述 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 2、解题思路 网上的解题方法有很多种,这里采用一种比较简单易懂的方法:DFS深度搜索 我下面使用的是c++代码。 注意:这里题目给出的结果返回值是vector<TreeNode*>,不要被题目中的输出结果所迷惑,以为是要输出一个二...

qq_34847754的博客 356

LeetCode 95. 不同的二叉搜索树 II

LeetCode 95. 不同的二叉搜索树 II 题目 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 ...

Ailecccc的博客 255

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

leetcode 95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3...

peony的博客 187

LeetCode95. 不同的二叉搜索树 II

LeetCode95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。 输入:3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \

qq_45080642的博客 264

leetcode95. 不同的二叉搜索树 II

给定一个整数 n,生成所有由 1 ...n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 ...

少说,多做。 3252
上一篇: Leetcode 中等:89.格雷编码
下一篇: Leetcode 中等:146. LRU缓存机制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程小助手_Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值