查找给定整数序列的排列数,这些排列产生相同的二叉搜索树

2023-11-27

给定一个整数数组arr = [5, 6, 1]。当我们以相同的顺序使用此输入构建 BST 时,我们将“5”作为根,“6”作为右子节点,“1”作为左子节点。

现在,如果我们的输入更改为 [5,1,6],我们的 BST 结构仍然相同。

那么给定一个整数数组,如何找到输入数组的不同排列的数量,这些排列会产生与按原始数组顺序形成的 BST 相同的 BST?


你的问题相当于计算给定 BST 的拓扑排序数量的问题。

例如,对于 BST

  10
 /  \
5   20
 \7 | \
    15 30

拓扑排序集可以这样手工计数:每个排序从 10 开始。从20开始的子树的拓扑排序数是两个:(20,15,30)和(20,30,15)。以 5 开头的子树只有一种排序:(5, 7)。这两个序列可以以任意方式交织,导致 2 x 10 交织,从而产生 20 个产生相同 BST 的输入。下面针对案例 (20, 15, 30) 列举了前 10 个:

 10 5 7 20 15 30
 10 5 20 7 15 30
 10 5 20 15 7 30
 10 5 20 15 30 7
 10 20 5 7 15 30
 10 20 5 15 7 30
 10 20 5 15 30 7
 10 20 15 5 7 30
 10 20 15 5 30 7
 10 20 15 30 5 7

情况 (20, 30, 15) 是类似的 --- 您可以检查以下任一输入是否生成相同的 BST。

这个例子还提供了一个递归规则来计算排序的数量。对于叶子节点,该数字为 1。对于具有一个子节点的非叶节点,该数字等于子节点的拓扑排序数。对于具有两个子树大小 |L| 的子节点的非叶节点和 |R|,分别具有 l 和 r 顺序,数量等于

  l x r x INT(|L|, |R|)

其中 INT 是 |L| 可能交错的数量和|R|元素。这可以通过 (|L| + |R|) 轻松计算! / (|L|!x |R|!)。对于上面的例子,我们得到以下递归计算:

  Ord(15) = 1
  Ord(30) = 1
  Ord(20) = 1 x 1 x INT(1, 1) = 2  ; INT(1, 1) = 2! / 1 = 2
  Ord(7) = 1
  Ord(5) = 1
  Ord(10) = 1 x 2 x INT(2, 3) = 2 x 5! / (2! x 3!) = 2 x 120 / 12 = 2 x 10 = 20

这解决了问题。

注意:此解决方案假设 BST 中的所有节点都有不同的密钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找给定整数序列的排列数,这些排列产生相同的二叉搜索树 的相关文章

  • 2D形状识别与解析算法

    我正在寻找一种算法 用于从给定的一组 x y 点检测简单形状 如矩形 三角形 正方形和圆形 我还在寻找一种方法 一旦检测到 将路径转换为更干净的形状 我已经查遍了互联网 但没有找到任何 简单 的方法 几乎所有这些对于我的简单实现来说都是高级
  • 依次构建完整的 B 树

    如果我有一组排序的数据 我想以最适合顺序读取和随机查找的方式将其存储在磁盘上 那么 B 树 或其中一个变体 似乎是一个不错的选择 假设该数据集并不全部适合 RAM 问题是可以从一组排序的数据构建完整的 B 树而不进行任何页面拆分吗 这样排序
  • 寻找簇的中心

    我有以下问题 进行抽象以找出关键问题 我有 10 个点 每个点与其他点有一定距离 我想要 能够找到簇的中心 即与其他点的成对距离最小的点 令 p j p k 表示点 j 和 k 之间的成对距离p i 是簇的中心点 iff p i s t m
  • 数字求和的算法?

    我正在寻找一种数字求和的算法 让我概述一下基本原则 假设你有一个号码 18268 1 8 2 6 8 25 2 5 7 7 是我们的最终数字 它基本上是将整个数字中的每个数字相加 直到我们得到一个 也称为 核心 数字 它经常被命理学家使用
  • 生成 2D 中的非简并点集 - C++

    我想在 2D 平面中创建一大组非退化的随机点云 整个集合中没有 3 个点在一条直线上 我有一个简单的解决方案 它生成一个随机浮点对 P new x y 并检查到目前为止生成的每对点 P1 P2 是否位于同一行 这需要 O n 2 检查添加到
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 读取4个点的坐标。他们做一个正方形吗?

    我计算点之间的距离 如果距离相等 则点构成一个正方形 否则不 仅当我按以下顺序读取坐标 A x y B x y C x y D x y 或相反时 我的代码才有效 但是如果我这样读 例如 A x y B x y D x y C x y 它将不
  • 为什么 n 按位和 -n 总是返回最右边的位(最后一位)

    这是Python代码片段 1 1 1 2 2 2 3 3 1 看来任何n n总是返回最右边 最后 位 我真的不知道为什么 有人可以帮助我理解这一点吗 这是由于负数以二进制表示的方式 称为二进制补码表示 创建某个数字 n 的补码 换句话说 创
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • 单词预测算法

    我确信有一篇关于此问题的帖子 但我找不到提出这个确切问题的帖子 考虑以下 我们有字典可供使用 我们收到了许多单词段落 我希望能够根据此输入预测句子中的下一个单词 假设我们有几个句子 例如 你好 我的名字是汤姆 他的名字是杰瑞 他去了没有水的
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • 线性问题和非线性问题之间的区别?点积和核技巧的本质

    核技巧将非线性问题映射为线性问题 我的问题是 1 线性问题和非线性问题的主要区别是什么 这两类问题的差异背后的直觉是什么 核技巧如何帮助在非线性问题上使用线性分类器 2 为什么点积在这两种情况下如此重要 Thanks 当人们说到分类问题的线
  • 二分查找问题? [复制]

    这个问题在这里已经有答案了 可能的重复 实施二分查找有哪些陷阱 https stackoverflow com questions 504335 what are the pitfalls in implementing binary se
  • 正则表达式等价

    有没有办法找出两个任意正则表达式是否等价 对我来说看起来很复杂的问题 但可能有一些 DFA 简化机制之类的 要测试等价性 您可以计算的表达式并进行比较

随机推荐

  • 如何使用 C# 对齐 ListView 中单个子项的文本?

    我无法在任何地方找到这个看似简单的主题的答案 是否可以在 WinForms ListView 控件中对齐单个子项的文本 如果是这样 怎么办 我希望同一列中的文本以不同方式对齐 例子 listView1 Columns 1 TextAlign
  • Android Chrome window.onunload

    我正在开发一个 HTML5 应用程序专门针对 Android 和 Chrome 我遇到的问题源于跟踪打开的浏览器选项卡的要求 我通过创建存储在每个选项卡的 sessionStorage 中的唯一 ID 来实现此目的 然后 我通过在每个选项卡
  • 更改了vhost并在CouchDB中重写,无法访问内部API

    我想将我的自定义域映射到设计文档 rewrite Configuration vhosts www myapp com myapp design user rewrite Rewrites from to static browser in
  • HashSet contains() 方法

    我执行下面的代码 发现输出是false import java util Set import java util HashSet public class Name private String first last public Nam
  • 正在运行的 Docker 容器何时会耗尽磁盘空间?

    我已经阅读了很多文档 但我仍然不确定这到底是如何工作的 这有点像 Docker 与 VM 的问题 如果我启动一个带有 2GB 硬盘的虚拟机并用文件填充其磁盘 我知道它会在 2GB 文件后耗尽 Docker 的工作方式相同吗 我想是这样 但从
  • 浮点数转二进制

    我正在尝试将浮点数转换为二进制表示形式 我怎样才能做到这一点 然而 我的目标是不限于 2m 因此我希望能够轻松扩展到任何基础 3 4 8 ecc 到目前为止 我对整数有一个简单的实现 import string LETTER 0123456
  • Django - 如何设置空白= False,必需= False

    我有一个这样的模型 class Message models Model msg models CharField max length 150 我有一个用于插入字段的表格 实际上 django 允许空白 例如 如果我在字段中插入一个空格
  • 如何查询 Npgsql.EntityFrameworkCore 中具有 JSON 数组的列

    Notes 使用 Npsql EntityFrameworkCore PostgreSQL v3 1 4 使用 Npgsql v4 1 3 1 使用代码优先方法 I have the following table called Cars
  • 如何避免键盘打开时jetpack撰写内容上升

    如上所示 当用户打开键盘时 项目列表 文本输入字段和添加按钮都会上升 我希望项目列表保持在原位 而文本输入字段和添加按钮则按原样上升 code 活动 class MainActivity ComponentActivity override
  • 与 SQL Server 建立连接时发生网络相关或特定于实例的错误

    我在 azurewebsites 上有一个简单的 mvc 网站 使用 VS internet 模板 与同一数据中心的 SQL Azure 数据库进行通信 此时的数据库只是做内置的SimpleMembership Provider 我已经从默
  • FFmpeg:在 Android Q 上无法使用文件描述符进行查找

    鉴于公共文件路径通常在具有范围存储的 Android Q 中不可用 我试图弄清楚如何使我的 FFmpeg 音频解码器使用文件描述符 而不将文件复制到我的应用程序的私有目录 我们可以使用中描述的方法轻松获取文件描述符Android Q 隐私更
  • 释放 GLKTextureLoader 分配的纹理(GLKTextureInfo 对象)

    对于 iOS 开发新手 尤其是 iOS 5 上的新 OpenGL 相关功能 如果我的问题非常基本 我深表歉意 我正在开发的应用程序旨在接收相机帧并通过 OpenGL ES 将它们显示在屏幕上 图形人员将接管此操作并添加我知之甚少的实际 Op
  • 像 PHP 一样使用 Request.Form 处理 HTML 输入元素数组

    我怎样才能在asp net上正确接收这些输入数组
  • jQuery 1.9.1 $.event.handle.apply 替代品

    我最近将我的一个项目更新到 jQuery 1 9 1 我无法再使用 event handle apply 方法 我搜索并发现 我可以放置jquery migrate js 我只是想确认一下是否还有其他选择 我的 google fu 在这里失
  • MongoDB GridFs用C#,如何存储图像等文件?

    我正在开发一个以 mongodb 作为后端的网络应用程序 我想让用户将图片上传到他们的个人资料中 例如链接的个人资料图片 我正在使用带有 MVC2 的 aspx 页面 并且我读到 GridFs 库用于将大型文件类型存储为二进制文件 我到处寻
  • ActionName 的目的

    使用 ActionName 属性为操作方法设置别名有什么好处 在为用户提供使用其他名称调用操作方法的选项方面 我确实没有看到它有多大好处 指定别名后 用户只能使用别名调用操作方法 但如果这是必需的 那么为什么用户不更改操作方法的名称而不是为
  • 当 reshape 无法猜测时变变量的名称时,重塑 r 中的数据

    我有一个包含超过 1500 列的宽格式数据集 由于许多变量都是重复的 我想将其重塑为长形式 然而 r 抛出一个错误 Error in guess varying Failed to guess time varying variables
  • 如何在 C#.NET 中跨线程锁定控制台?

    我有一个logger处理各种带有漂亮颜色的信息显示的类 是的 但是 由于它写入控制台分开的步骤 即 将颜色设置为红色 写入文本 将颜色设置为灰色 写入文本 以便呈现 错误 描述 错误为红色 但我有一个多线程应用程序 因此这些步骤可能会混淆并
  • 从 SQL Server 列获取 XML 节点作为逗号分隔列表

    我有一个数据存储在 xml 列中 并且需要一个以逗号分隔的子节点列表 使用下面的脚本 我只能得到 A B C 请帮助我使用 xquery 获取 A B C 简单地用逗号替换空格没有帮助 因为我们的数据里面有空格 create table T
  • 查找给定整数序列的排列数,这些排列产生相同的二叉搜索树

    给定一个整数数组arr 5 6 1 当我们以相同的顺序使用此输入构建 BST 时 我们将 5 作为根 6 作为右子节点 1 作为左子节点 现在 如果我们的输入更改为 5 1 6 我们的 BST 结构仍然相同 那么给定一个整数数组 如何找到输