LeetCode 面试题 04.09. 二叉搜索树序列

news2024/12/27 11:55:32

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

  从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。

  给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。

  点击此处跳转题目。

示例 1:

输入: root = [2,1,3]
输出: [[2,1,3],[2,3,1]]
解释: 数组 [2,1,3]、[2,3,1] 均可以通过从左向右遍历元素插入树中形成以下二叉搜索树

   2 
  / \ 
 1   3

示例 2:

输入: root = [4,1,null,null,3,2]
输出: [[4,1,3,2]]

提示:

  • 二叉搜索树中的节点数在 [0, 1000] 的范围内
  • 1 <= 节点值 <= 10^6
  • 用例保证符合要求的数组数量不超过 5000

二、C# 题解

  分析题目,第一个放入的只能是根结点,其次是其左右孩子。流程如下:

  1. 首先可以放入根结点:【2】
  2. 2 放入后,其左右孩子都可以放入:【1,4】
  3. 放入 1 时,后续可以放入:【5,4】;放入 4 时,后续可以放入:【1,6,7】

  因此可以发现,这是一个逐步推进的过程,即数组中每次放入的结点只能是当前已放入结点的孩子,而不能越级。一旦越级,例如依次放入:【2,1,6】,会发现放入 6 时,6 将直接成为 2 的右孩子,将 4 这一层打破了。

在这里插入图片描述
  使用 next 数组记录后续可以访问的结点,lst 数组记录每一个答案。递归回溯求解如下:

/**
 * 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<IList<int>> BSTSequences(TreeNode root) {
        IList<IList<int>> ans = new List<IList<int>>();

        // 如果树为空,返回空
        if (root == null) { ans.Add(new List<int>()); return ans; }

        // BFS 遍历,将结果存储到 ans 中
        Partition(ans, new List<int>(), new List<TreeNode> { root });

        return ans;
    }

    // lst 存储每种情况的数组,next 存储下一个访问结点
    public void Partition(IList<IList<int>> ans, IList<int> lst, List<TreeNode> next) {
        // 遍历每个 next 结点
        for (int i = 0; i < next.Count; i++) {
            // 结点处理
            TreeNode node = next[i];                      // 取出该结点 node
            lst.Add(node.val);                            // 将 node 值加入 lst 中
            next.Remove(node);                            // 访问完成后删除 node 记录
            if (node.left != null) next.Add(node.left);   // 左右孩子不为空,则将成为下一个访问节点
            if (node.right != null) next.Add(node.right);

            Partition(ans, lst, next); // 继续访问后续结点

            // 访问完成后,回到原始状态,为进入下一个 next 结点做准备
            next.Insert(i, node);    // 收回 node 结点
            next.Remove(node.left);  // 删除 node 左右孩子的记录
            next.Remove(node.right);
            lst.Remove(node.val);    // 取出 node 值
        }

        if (next.Count == 0) ans.Add(new List<int>(lst)); // next 为空,表示遍历完所有结点,此时将 lst 放入 ans 中
                                                          // 注意需要拷贝 lst,否则加入的是引用
    }
}

  可以将 next 数组改为队列,减少删除元素所需的时间,这里就不改了,懒。

  • 时间复杂度:难算。
  • 空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

商家收款码手续费收费标准

不管是微信还是支付宝&#xff0c;商户最低的收款手续费率可以达到0.2%费率。一般我们普通商户的收款费率一般在0.6左右&#xff0c;当然也有使用0.3的&#xff0c;也就是1万元的费率是30-60块钱&#xff0c;对于一些流水比较大的商家来说&#xff0c;确实很有必要把这个手续费…

为什么有了IP地址还需要MAC地址?

上午好&#xff0c;我的网工朋友。 今天想和你聊聊Mac地址。 到底啥是Mac地址&#xff1f;官方直译是媒体存取控制位址&#xff0c;是一个用来确认网络设备位置的位址。 在OSI模型中&#xff0c;第三层网络层负责IP地址&#xff0c;第二层数据链路层则负责MAC位址。 MAC地址…

【JavaEE】多线程(三)

多线程&#xff08;三&#xff09; 续上文&#xff0c;多线程&#xff08;二&#xff09;&#xff0c;我们已经讲了 创建线程Thread的一些重要的属性和方法 那么接下来&#xff0c;我们继续来体会了解多线程吧~ 文章目录 多线程&#xff08;三&#xff09;线程启动 startsta…

微信小程序如何跳转到tabBar页面、如何携带参数过去

文章目录 一、跳转链接时&#xff0c;不能使用navigator标签、 wx.navigateTo、wx.redirectTo方法跳转页面问题解决&#xff1a;1、wx.switchTab(Object object)2、wx.reLaunch(Object object) 二、不能用常规的方式给tabBar的页面传递参数问题解决&#xff1a;1、用前面提到的…

聚观早报 | 联发科天玑9300跑分曝光;OPPO A2 Pro开启预售

【聚观365】9月18日消息 联发科天玑9300跑分曝光 OPPO A2 Pro开启预售 哪吒汽车泰国累计交付破1万台 小米13T系列最新渲染图出炉 酷派手机新品通过工信部入网 联发科天玑9300跑分曝光 今年上半年&#xff0c;联发科推出了天玑9200移动平台&#xff0c;截至目前已有多款机…

二蛋赠书三期:《C#入门经典(第9版)》

文章目录 前言活动规则参与方式本期赠送书籍介绍作者介绍内容简介读者对象获奖名单 结语 前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术…

Apache httpd 安全漏洞处理-升级httpd版本

文章目录 前言一、现状二、使用codeit库升级Apache1. 安装epel-release2. 下载codeit的repo文件3. 查看版本信息4. 更新httpd版本后确认版本5. 重启httpd服务 总结 前言 手上有台zabbix-server服务器&#xff0c;用了httpd的服务支撑&#xff0c;漏扫时发现有很多的Apache htt…

具体项目下解决Echarts多端同步开发和维护的问题

具体问题场景 PC端和移动端需要同时上线图表功能&#xff08;没有多余工时&#xff09; 之后的版本迭代&#xff08;功能、样式、配置等&#xff09;默认双端同步&#xff0c;开发人员只希望维护一套代码 Echarts在移动端有部分功能不兼容不支持 Echarts在移动端的坑 ① 移动端…

AI与医疗保健:革命性技术如何拯救生命

文章目录 引言AI的应用领域1. 影像识别2. 疾病诊断3. 药物研发4. 个性化治疗 AI技术1. 机器学习2. 深度学习3. 自然语言处理4. 基因组学 实际案例1. Google Health的深度学习模型2. IBM Watson for Oncology3. PathAI的病理学分析 道德和隐私考虑结论 &#x1f389;欢迎来到AIG…

振弦采集仪和传感器在岩土工程中安装方法的关键要点

振弦采集仪和传感器在岩土工程中安装方法的关键要点 振弦采集仪和传感器在岩土工程中的安装方法是岩土工程中非常关键的过程。其安装质量的好坏直接影响实验数据的准确性&#xff0c;进而影响工程设计和施工效果。因此&#xff0c;在实际工作中&#xff0c;如何正确的安装振弦…

0基础学习VR全景平台篇 第100篇:美团酒店丨平台上传全景全流程

目前美团平台已经具备VR全景图在美团App客户端的展示能力&#xff0c;但目前E-Booking暂未开通上传通道&#xff0c;若商家您有全景图且有意愿上传至平台&#xff0c;需要签署授权书&#xff0c;并依照规定的格式要求发送邮件申请&#xff0c;由平台代为人工上传。具体规则和要…

一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了

一款非常容易上手的报表工具&#xff0c;简单操作实现BI炫酷界面数据展示&#xff0c;驱动支持众多不同类型的数据库&#xff0c;可视化神器&#xff0c;免开源了。 在互联网数据大爆炸的这几年&#xff0c;各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的…

循环神经网络——上篇【深度学习】【PyTorch】【d2l】

文章目录 6、循环神经网络6.1、序列模型6.1.1、序列模型6.1.2、条件概率建模6.1.2、代码实现 6.2、文本预处理6.2.1、理论部分6.2.2、代码实现 6.3、语言模型和数据集 6、循环神经网络 6.1、序列模型 6.1.1、序列模型 序列模型主要用于处理具有时序结构的数据&#xff0c; *…

OA 电子审批流程是什么?

公司中&#xff0c;最最最常见也是最最最多的就是——各种审批。 我当年第一次实习&#xff0c;在一家国企的行政部门&#xff0c;我们部门领导那个时候最主要的工作就是“打通流程”&#xff0c;咱也不知道他在打通什么流程&#xff0c;反正这个很重要就是了。 结果&#xf…

docker swarm集群

集群构建 不包含在任何 Swarm 中的 Docker 节点&#xff0c;称为运行于单引擎&#xff08;Single-Engine&#xff09;模式。一旦被加入 Swarm 集群&#xff0c;则切换为 Swarm 模式。第一步我们要做的就是初始化 Swarm。 初始化swarm集群 将本机作为manager节点 docker swar…

小谈设计模式(4)—单一职责原则

小谈设计模式&#xff08;4&#xff09;—单一职责原则 专栏介绍专栏地址专栏介绍 单一职责原则核心思想职责的划分单一变化原则高内聚性低耦合性核心总结 举例图书类&#xff08;Book&#xff09;用户类&#xff08;User&#xff09;图书管理类&#xff08;Library&#xff09…

强信创,高实用:SuperMap开发者线上训练营9月25日起航

当前&#xff0c;信创工作全面开展&#xff0c;从细分领域延展至所有领域&#xff0c;自主GIS技术也迈入新的发展阶段。2023年9月25日至9月27日&#xff0c;北京超图软件股份有限公司、917书院GIS学堂将主办以“强信创、高实用”为主题的SuperMap开发者训练营&#xff08;以下简…

路由器ip地址设置

当你使用路由器时&#xff0c;你可以按照以下步骤设置路由器的IP地址。这样可以确保你的网络连接正常并允许其他设备连接到你的路由器。 **步骤一&#xff1a;登录路由器管理界面** 首先&#xff0c;你需要登录到路由器的管理界面。打开你的浏览器&#xff0c;并输入路由器的…

【校招VIP】java语言考点之switch和default

考点介绍&#xff1a; switch、default是 校招Java岗位面试时常考的关键字组合之一。 java语言考点之switch和default-相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点试题 1、switch语句能否作用在byte上&#xff0c;能否作用在long上&#xff0c;能否作用…

ubuntu 22.04通过apt-get安装的apache2将http改造为https的方法

目录 一、安装apache2 二、启动apache2服务 三、访问http网页 四、改造https &#xff08;一&#xff09;查看apache2是否安装了ssl模块 &#xff08;二&#xff09;安装apache2-dev &#xff08;三&#xff09;配置SSL访问 1. 生成私有证书 2. 新增ssl配置文件 3. 重…