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

2023-11-11

一、题目

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

  给定一个由不同节点组成的二叉搜索树 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 面试题 04.09. 二叉搜索树序列 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 私有模板函数

    我有一堂课 C h class C private template
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 王道快速排序和归并排序的完整代码

    这是快排的代码要作为模板背下来 include
  • 唐诗

    作者 楚予微茫 链接 https zhuanlan zhihu com p 79798355 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 送杜少府之任蜀州 王勃 城阙辅三秦 风烟望五津 与君离别意 同是宦
  • Android---ImageSpan + SpannableStringBuilder 图文混排解决表情文字高度不一致排版错乱问题(设置padding 行间距依然生效)

    文章目录 前言 一 继承ImageSpan重写绘制方法 二 实践 前言 android图文混排的最常见实现方案就是使用SpannableStringBuilder 比如我们要实现聊天框输入表情的功能就需要用到其实现 但是当我们的icon图标
  • Java多重循环

    一 多重循环的理解 1 多重循环指一个循环语句的循环体中再包含循环语句 又称嵌套循环 2 循环语句内可以嵌套多层循环 3 不同的循环语句可以相互嵌套 语法格式 while 循环条件1 循环语句1 while 循环条件2 循环语句2 do 循
  • 分享人工智能方向优质技术博客

    Machine learning Blogs 想要阅读更多关于人工智能技术博客 请关注微信公众号 人工智能大讲堂 专注人工智能底层数学原理和应用 专栏包括线性代数 概率统计 机器学习 深度学习 线性代数博客汇总 线性代数博客合集 线性代数本
  • 激光雷达Velodyne VLP16在ROS下的使用

    Velodyne VLP16在ROS下的使用 前置条件 Ubuntu 16 04 激光雷达VLP16 ROS kinetic 使用步骤 基础设置 安装驱动 sudo apt get install ros kinetic velodyne
  • 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)

    写在前面的话19 04 04 今年省赛的结果出的意外得快 有很多小伙伴来和我分享他们进了省一的喜悦 并问我啥时候更新国赛题解 emmm 不是我不想更新 实在是抽不出时间 有缘再更 虽然不更新题解 但是我决定这次提前写一点注意事项吧 省得大家
  • java 24点游戏

    24点纸牌游戏 一 内容 二 步骤 1 算法分析 2 概要设计 3 测试 4 调试 5 心得体会 一 内容 24点游戏是经典的纸牌益智游戏 常见游戏规则 从扑克中每次取出4张牌 使用加减乘除 第一个能得出24者为赢 其中 J代表11 Q代表
  • 分享一个效果很好的ddos压力测试服务网站

    分享一个经测试效果好的ddos压力测试网站 打开网站 http www akddos com 免费注册一个账户即可测试 udp流量最高400G 支持SYN CC DNS等多种模式 套餐自由选择 效果很好 大家可以去试试 网站主要是用来测试自
  • 给定一个整数数组,判断是否存在重复元素。

    存在重复元素 给定一个整数数组 判断是否存在重复元素 如果存在一值在数组中出现至少两次 函数返回 true 如果数组中每个元素都不相同 则返回 false 示例 1 输入 1 2 3 1 输出 true 作者 力扣 LeetCode 链接
  • html动态爱心代码【三】(附源码)

    目录 前言 特效 内容修改 完整代码 总结 前言 七夕马上就要到了 为了帮助大家高效表白 下面再给大家带来了实用的HTML浪漫表白代码 附源码 背景音乐 可用于520 情人节 生日 表白等场景 可直接使用 特效 内容修改 文字区 div h
  • 反卷积层(转置卷积)

    反卷积 deconvolution 不是数字信号处理里面的意义 在深度学习里面应该叫做转置卷积 transposed convolution 又名微步卷积 fractionally strided convolutions 也有叫Backw
  • Qt5开发学习总结(三)——窗口部件的使用(QWidget和QDialog)

    窗口部件 QT提供的默认基类只有QMainWindow QWidget 和QDialog这三种 这三种窗体也是用的最多的 QMainWindow是带有菜单栏和工具栏的主窗口类 QDialog是各种对话框的基类 而他们全部继承自QWidget
  • 力扣简单题合集(带答案)

    1 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 class Solution publi
  • [leetcode 周赛 149] 1155 掷骰子的N种方法

    目录 1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法 描述 思路 代码实现 1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法 描述 这
  • Windows下安装MySQL(详解)

    Windows下安装MySQL MySQL8 0下载链接 https pan baidu com s 1w2TcLGel51jJwJerQneVjg pwd zzkt 提取码 zzkt 也可以选择在官网上下载 1 在百度 其他浏览器也可以
  • Windows环境下nacos的下载与安装

    一 nacos的下载地址 https github com alibaba nacos 根据自己项目配置的版本 下载对应的nacos客户端 windows下载zip安装包 linux下载tar gz包 二 下载解压成功后 修改配置文件D n
  • 达梦中Hibernate的Save问题

    业务逻辑 在原有数据源是mysql的基础上适配达梦时 使用Hibernate的save方法进行保存 save保存后会返回自增主键id的数值 再根据这个返回值来进行updateorsave更新操作 某字段为主键id值 固定字符组成 问题 返回
  • 钢条切割问题——(暴力法(Brute force), Top-down DP演算法,Bottom-up DP演算法)对比

    注意 以下是三合一的代码 如果只想要 暴力法 Brute force https blog csdn net qq 37486501 article details 84844197 Top down DP演算法 https blog cs
  • LeetCode 面试题 04.09. 二叉搜索树序列

    文章目录 一 题目 二 C 题解 一 题目 从左向右遍历一个数组 通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树 给定一个由不同节点组成的二叉搜索树 root 输出所有可能生成此树的数组 点击此处跳转题目 示例 1 输入 root