在 BST 中查找中序后继而不使用任何额外空间

2024-04-14

我正在寻找一种方法来找出 BST 中节点的中序后继者,而不使用额外的空间。


获取给定节点的中序后继节点N我们使用以下规则:

  • If N有一个合适的孩子R那么inorderSuccessor(N)是最左边的 的后继者R.
  • Else inorderSuccessor(N)是最接近的 祖先,M, of N(如果存在) 这样N是从 的左孩子M。如果没有这样的祖先,则 inorderSucessor 不存在。

考虑一个示例树:

     A
    / \
   B   C
  / \ 
 D   E
    /
   F

其中序遍历给出:D B F E A C

inorderSuccessor(A) = C as C是右孩子的最左边的后裔A.

inorderSuccessor(B) = F as F是右孩子的最左边的后裔B.

inorderSuccessor(C)= 不存在。

inorderSuccessor(D) = B as B是的左孩子D.

inorderSuccessor(E) = A. E没有正确的孩子,所以我们有场景 2。我们去找E这是B, but E是 的右继承人B,所以我们移动到父级B这是A and B被遗弃的A so A就是答案。

inorderSuccessor(F) = E as F是的左孩子E.

程序:

treeNodePtr inorderSucessor(treeNodePtr N) {
        if(N) {
                treeNodePtr tmp;
                // CASE 1: right child of N exists.
                if(N->right) {
                        tmp = N->right;
                        // find leftmost node.
                        while(tmp->left) {
                                tmp = tmp->left;
                        }
                // CASE 2: No right child.
                } else {
                        // keep climbing till you find a parent such that
                        // node is the left decedent of it.
                        while((tmp = N->parent)) {
                                if(tmp->left == N) {
                                        break;
                                }
                                N = tmp;
                        }
                }
                return tmp;
        }
        // No IOS.
        return NULL;
}

代码在行动 http://www.ideone.com/imqy2

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

在 BST 中查找中序后继而不使用任何额外空间 的相关文章

  • 如何计算列表的最小不公平性总和

    我试图将问题陈述总结如下 Given n k和一个数组 列表 arr where n len arr and k is an integer in set 1 n inclusive 对于数组 或列表 myList 不公平总和定义为sum中
  • 用于整数分区的优雅 Python 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我尝试编写代码来解决标准整数分区问题 维基百科 http en wikipedia org wiki Partition 28numb
  • 什么是确定性快速排序?

    我一直在阅读有关快速排序的内容 发现有时它被称为 确定性快速排序 这是普通快速排序的替代版本吗 普通快速排序和确定性快速排序有什么区别 普通 确定性 快速排序在特定数据集上的行为可能非常差 例如 选择第一个未排序元素的实现在已排序数据上的时
  • 基数首先排序最重要的还是最不重要的,哪个更快?

    我一直在研究基数排序实现 到目前为止粘贴在下面的代码 代码是用 Java 编写的 但在 C C 中应该也能正常工作 正如您从实现中看到的 我首先执行最高有效位 即整数的第 31 位 这似乎更快 因为一旦子组完成 就不再需要迭代 例如 打个比
  • 如何返回 Solidity 中的结构数组?

    我正在为以太坊智能合约设计一个解决方案bidding 用例包括保留名称 例如 myName 并分配给一个地址 然后 人们可以竞标该名称 在本例中为 myName 可以有多个名称发生多次此类出价 struct Bid address bidO
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 图像算法上的物体计数

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

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • 总和不小于 key 的数组的最小子集

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

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 在一个区域中拟合二维多边形的算法?

    这有标准吗 算法名称 说 我有 10 个不同大小的多边形 我有一个特定大小的区域 我想知道如何填充该区域中的最多多边形 以及它们是如何拟合的 笔记 多边形可以根据限制集进行旋转 一个可能的名称是包装问题 http en wikipedia

随机推荐

  • SQLite Python 插入 - 提供的绑定数量不正确

    如果这是多余的 我很抱歉 我花了很多时间试图找到答案 但提供的技巧似乎没有任何作用 我正在尝试使用 Python 将股票数据的 csv 文档读入 SQLite 雅虎财经 Ticker Open High Low Close Volume A
  • 回调中的 Tornado IOLoop 异常 Celery 工作线程中没有

    我在用tornado ioloop inside celery工人 因为我需要使用 mongodb class WorkerBase gen engine def foo self args callback bar Python Cele
  • 绑定中的 JAXB 空节点

    JAXB无法解析此示例的绑定
  • UTF-8 编码、JSP、jQuery、Spring 的问题

    我在 apache tomcat 6 中有一个带有 spring jsp 和 jquery 的 Web 应用程序 一个 jsp 页面有一个表单 该表单通过 jquery 进行的 ajax 调用将数据发送到我后端的 Spring MultiA
  • .net core azure部署失败:项目文件不存在

    我在 Azure 中设置了一个应用程序服务应用程序 该应用程序设置为在提交到团队服务 git 存储库时部署 到目前为止 这一直工作正常 但部署失败 并显示 MSBUILD error MSB1009 Project file does no
  • php 字符串末尾的 Substr?

    我有这种数组 我会让它变得非常简单易懂 picture artist2 1 thumb jpg artist2 2 jpg artist2 3 thumb jpg artist2 4 jpg artist2 5 thumb jpg 现在我想
  • WPF 断边

    我在使用 WPF 时遇到了一个相当奇怪的问题 当我将按钮放置在窗体上时 它们在设计时看起来很好 在 Windows XP 上看起来也很好 但当应用程序在 Windows 7 上运行时 边缘会损坏 Here is a screen shot
  • 访问 WinForms 中的 ToolStripMenuItem 子项

    H all 我在 Winform 中创建了一个菜单条 但不是动态的 而且这一切都是不可见的 当用户拥有权限时才可见 我的用户名之一拥有完全的权利 为此我写了下面的代码 private void menuActive MenuStrip me
  • 尝试加载动画时 Resources$NotFoundException

    我们在 Google Play 市场上的应用程序在某些设备上抛出了一个奇怪的异常 我看到以下堆栈跟踪 android content res Resources NotFoundException File res anim ani in
  • 使用 perl 包时将参数传递给它

    如何在使用包时传递一些参数 例如 use Test More tests gt 21 我无法找到有关此功能的任何有价值的文档 通过这样的论点有什么优点和缺点吗 use My Module LIST https metacpan org po
  • React Native改变监听端口

    我正在使用 React Native Android 并且在 Android 设备上部署应用程序时遇到问题 当我跑步时 react native启动 它不会在端口上启动开发服务器8081 我尝试了以下提到的一些选项 https reactn
  • 我设置了 hellomap 示例并收到以下错误

    我正在 Android Studio 中工作 并且在运行时不断收到此错误 E CL magma ERROR CL magma Unable to open shader file shaders gles2 0 Primitive shad
  • NotifyPropertyChanged 线程安全吗?

    我正在看NotifyPropertyChanged from INotifyPropertyChanged并注意到在 Microsoft 的示例中 如下所示 http msdn microsoft com en us library sys
  • Android:socket.io io.socket.engineio.client.EngineIOException:XHR 轮询错误

    有时我会收到此错误 io socket engineio client EngineIOException xhr 轮询错误 我的连接到套接字的代码 try HostnameVerifier myHostnameVerifier new H
  • 如何使 SendKeys 在 IBM Host Access Library 中同步动作

    我用用于 COM 自动化的 IBM 主机访问类库 https www 01 ibm com support knowledgecenter SSEQ5Y 6 0 0 com ibm pcomm doc books html host acc
  • google api 控制台删除了我注册的应用程序

    几个月前 我在 Google 开发者控制台中注册了两个 Android 应用程序 以使用 Google 地图 Android API 版本 2 今天 当我登录注册另一个应用程序时 我注意到 Google API 控制台没有显示我以前注册的应
  • “download_slot”在 scrapy 中如何工作

    我在 scrapy 中创建了一个脚本来解析author name来自其着陆页的不同帖子 然后将其传递到parse page方法使用meta关键字以打印post content随着author name同时 我用过下载槽在元关键字中 据称该关
  • hibernate_unique_key表是如何在新数据库中创建的?

    我正在尝试使用 NHibernate 创建我的第一个测试应用程序 如下所示NHibernate 2 0 初学者指南 https rads stackoverflow com amzn click com 1847198902 该示例在映射中
  • EF Code-First 中查找表的最佳实践

    我正在使用 EF 做我的第一个项目 并且计划采用代码优先模型 我正在尝试找到一些有关处理相当经典的 查找表 场景的指导 我正在处理一个非常规范的情况 我将保留地址数据 所以 我有一个简单的地址 DTO public class Addres
  • 在 BST 中查找中序后继而不使用任何额外空间

    我正在寻找一种方法来找出 BST 中节点的中序后继者 而不使用额外的空间 获取给定节点的中序后继节点N我们使用以下规则 If N有一个合适的孩子R那么inorderSuccessor N 是最左边的 的后继者R Else inorderSu