对于给定的二叉树找到最大二叉搜索子树

2024-01-04

对于给定的二叉树,找到最大的子树也是二叉搜索树?

Example:

Input:

                   10
               /         \
             50           150
            /  \         /   \
          25    75     200    20
         / \   / \    /  \    / \
        15 35 65 30  120 135 155 250 

Output:

                   50
                  /   \
                 25   75
                / \   /
               15 35  65

该答案之前包含基于链接/切割树的 O(n log n) 算法。这是一个更简单的O(n)解决方案。

核心是一个过程,它接受一个节点、以其左子节点为根的唯一最大 BSST、以其右子节点为根的唯一最大 BSST,以及指向这些 BSST 的最左边和最右边元素的指针。它破坏其输入(可通过持久数据结构避免)并构造以给定节点为根的唯一最大 BSST 及其最小和最大元素。所有 BSST 节点都用后代数量进行注释。和以前一样,这个过程在后序遍历中被重复调用。要恢复子树,请记住最大 BSST 的根;重建它只需要简单的遍历。

我将只处理左侧 BSST;右边是对称的。如果左侧 BSST 的根大于新根,则删除整个子树,并且新根现在位于最左侧。否则,旧的最左边节点仍然是最左边。从左边BSST的最右边的节点开始,向上移动,找到第一个小于或等于根的节点。它的右孩子必须被移除;现在请注意,由于 BST 属性,不需要其他节点!继续到左侧 BSST 的根,更新计数以反映删除。

这是 O(n) 的原因是,尽管有循环,原始树中的每条边本质上只被遍历一次。


编辑:总的来说,所经过的路径是 BST 中的最大直线路径,除了左脊柱和右脊柱之外。例如,在输入上

              H
             / \
            /   \
           /     \
          /       \
         /         \
        /           \
       /             \
      D               L
     / \             / \
    /   \           /   \
   /     \         /     \
  B       F       J       N
 / \     / \     / \     / \
A   C   E   G   I   K   M   O

以下是遍历每条边的递归调用:

              H
             / \
            /   \
           /     \
          /       \
         /         \
        /           \
       /             \
      D               L
     / h             h \
    /   h           h   \
   /     h         h     \
  B       F       J       N
 / d     d h     h l     l \
A   C   E   G   I   K   M   O
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于给定的二叉树找到最大二叉搜索子树 的相关文章

  • 对二进制二维矩阵进行排序?

    我在这里寻找一些指示 因为我不太知道从哪里开始研究这个 我有一个二维矩阵 每个单元格中有 0 或 1 例如 1 2 3 4 A 0 1 1 0 B 1 1 1 0 C 0 1 0 0 D 1 1 0 0 我想对其进行排序 使其尽可能 上三角
  • 如何生成排列?

    我的问题是 给定一个长度为 n 的列表 L 和一个整数 i 使得 0 对于任意 i 和任意 2 个列表 A 和 B perm A i 和 perm B i 都必须将 A 和 B 的第 j 个元素映射到 A 和 B 相同位置的元素 对于任何输
  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 用于整数分区的优雅 Python 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我尝试编写代码来解决标准整数分区问题 维基百科 http en wikipedia org wiki Partition 28numb
  • JAVA:二叉树

    在这里 我尝试练习制作二叉树 以便我可以对它们进行不同的操作 import java util import java lang public class Main public static void main String args B
  • 所有可能的骑士在普罗梅拉的棋盘上移动

    是否有可能用马从初始位置 I J 绕过大小为 N N 的棋盘 并且只访问每个方格一次 define A True A I J false active proctype method bit I 4 bit J 3 bit K 1 bit
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • Google 文档如何处理编辑冲突?

    我一直在尝试编写自己的 Javascript 编辑器 其功能类似于 Google Docs 允许多人同时使用 我不明白一件事 假设用户 A 和用户 B 直接相互连接 网络延迟为 10 毫秒 我假设编辑器使用 diff 系统 据我了解 Doc
  • 序列和与 GCD

    大约一个月前 我在编程挑战中遇到了这个问题 但社论尚未发布 所以我在这里问 有一个大小为 N 的数组 A 求 A 的 K 个长度子序列的总和 GCD Example 如果 A 1 2 3 且 K 2 1 2 3 总和 1 GCD 3 1 3
  • 如何在 JavaScript 中构建树模式匹配算法?

    好吧 这是一个有点复杂的问题 但是 tl dr 基本上是如何使用 模式树 解析 实际树 如何检查特定的树实例是否与特定的模式树匹配 首先 我们有我们的结构模式树 模式树通常可以包含以下类型的节点 sequence节点 匹配一系列项目 零个或
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进

随机推荐

  • 获取元视口标签以在桌面上工作

    我创建了一个在桌面上启用元视口标签的脚本 但是我似乎无法从视口标签获取指定的宽度 我目前有这个 var viewportcontent myviewport attr content var viewportcontents viewpor
  • 属性错误:“对象没有属性”

    我有一个问题 我正在使用 python 3 编写代码 该代码是将网站的新闻发布到我的画布上 但是我不断收到此错误 其中显示 AttributeError NewsFeed 对象没有属性 canvas 这是我的代码 from tkinter
  • 查询将行数据显示为列

    我需要一个查询来执行行记录作为列 例如 行保存数据为 101 102 103 104 结果应该是 101 102 103 104 你可以检查切换sql中的行和列 http www simple talk com sql t sql prog
  • 如何高效生成Zipf分布数?

    我目前正在对 C 中的一些数据结构进行基准测试 我想在处理 Zipf 分布式数字时测试它们 我正在使用此网站上提供的生成器 http www cse usf edu christen tools toolpage html http www
  • 在c中交换两个结构

    您好 我正在尝试创建一个交换函数来交换结构的前两个元素 有人可以告诉我如何进行这项工作吗 void swap struct StudentRecord A struct StudentRecord B struct StudentRecor
  • 在 VSCode 中关闭提交消息文件时,Git 挂起并显示“提示:正在等待编辑器关闭文件...”

    我在跑git commit amend在 VSCode 终端中 它会在 VSCode 编辑器窗口中以文件形式弹出提交消息 并且 git 会说 在终端中 hint Waiting for your editor to close the fi
  • 有没有办法自定义ViewPager滚动的阈值?

    我无法找到更改 ViewPager 中滚动页面的触摸阈值的方法 http developer android com reference android support v4 view ViewPager html http develop
  • 获取上次重新启动时间[重复]

    这个问题在这里已经有答案了 可能的重复 显示构建日期 https stackoverflow com questions 1600962 displaying the build date 如何知道 Windows 何时启动或关闭 http
  • 声明全局静态变量

    我正在尝试在 Visual Studio 中设置全局变量 但无法将其设为静态 有什么方法可以让我将变量设置为静态并在不同的方法之间共享它 或者有什么方法可以在每次更改时保存变量 您有两个选择 1 创建一个包含共享变量的类 这与 C 中的静态
  • 摆脱新 Android 上的旧应用程序图标

    前段时间我做了一个简单的 Android 应用程序 一个上传数据的共享意图处理程序 现在我为它设计了一个新的 SVG 图标 以矢量图形导入到项目中 然后使用 InkScape 转换为一系列 PNG 并替换项目中的所有 PNG 该应用程序现在
  • 使用 SparkSession 或 sqlcontext 时出错

    我是火花新手 我只是想使用sparksession 或sqlcontext 解析json 文件 但每当我运行它们时 我都会收到以下错误 Exception in thread main java lang NoSuchMethodError
  • 无法在 /usr/bin 内部创建符号链接,即使使用 sudo [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我尝试对 usr bin 文件夹中的二进制文件进行符号链接时 出现 操作不允许 错误 sudo ln s usr bin python2
  • 在两个进程之间交换大量数据的最有效方法是什么?

    最近我正在为一个软件构建DVR http en wikipedia org wiki Digital video recorder 它将安装在插入了 2 个或更多 PCIE x4 视频编码器卡的 x86 PC 服务器上 我们有两个独立的进程
  • 单击标签时阻止 select2 打开

    这个问题演变成了阻止按下回车键时打开下拉菜单 正如你所看到的 我丑陋的解决方案用一个关闭下拉菜单setTimeout当标签输入具有焦点时按 Enter 键 如何防止它在输入时完全打开 而不是在打开后关闭它 以下是一些可能有用的事件 http
  • 顶部“xterm”:未知终端类型

    运行 TOP 命令时出现错误 gt top xterm unknown terminal type gt echo TERM xterm gt echo DISPLAY DYSPLAY Undefined variable gt cat e
  • 当 HTML5 搜索输入可见时,嵌入的 YouTube 视频无法在 iPad (iOS 7) 上播放

    这是一个错误 我已经设法通过暴力修复 但我不明白为什么该解决方案有效 问题在于 嵌入式 YouTube 视频无法在 iPad 在 iOS7 中测试 的横向视图中的特定 响应式 网站上运行 我设法将其范围缩小到一个特定的 CSS 规则 当浏览
  • C# 8.0 默认接口实现基本语法/显式调用

    我一直在搞乱默认的接口实现 认为您必须向下转换为接口类型才能使用默认方法实现 我还发现了一堆关于另一种语法的注释 我找不到这是否已经包含在内 我确实找到了关于它的外观的 决定 但是它不起作用 我做错了吗 还是这个新语法尚未包含在内 有些相关
  • 如何将 matplotlib 图导出为具有可编辑文本字段的矢量图形?

    我正在尝试导出多个绘图以在 Adob e Illustrator 中进行编辑 并且尝试将标题 轴标签和条形图标签作为单独的文本字段 即 如果我单击 Illustrator 或您选择的编辑器 中的标题 整个标题就是一个单独的字段 以下是我如何
  • C# - 无法处理 Enter 和 Tab 键事件

    我是新的 c 我正在使用下面的代码 但该代码不适用于 Enter 键和 Tab 键 请解决这个问题 private void Panel Load object sender EventArgs e this KeyDown new Key
  • 对于给定的二叉树找到最大二叉搜索子树

    对于给定的二叉树 找到最大的子树也是二叉搜索树 Example Input 10 50 150 25 75 200 20 15 35 65 30 120 135 155 250 Output 50 25 75