Java:如何返回破坏二叉搜索树的节点?

2024-01-02

研究一个应该返回破坏二叉搜索树的节点的方法,如果没有一个节点返回破坏二叉搜索树的节点,则返回 null。一些测试用例通过了,但其中一些失败了,我不确定为什么。 到目前为止,这是我的代码:

public static Node checkBSTValidity(Node rootNode) {
    // Your code here (remove the placeholder line below)
    if (rootNode == null) {
       return null;
    }
    
    // Check if left child node is greater than root node
    if (rootNode.left != null && maxValue(rootNode.left) >= rootNode.key) {
       Node node = new Node(maxValue(rootNode.left));
       return node;
    }
    
    // Check if right child node is less than root node
    if (rootNode.right != null && minValue(rootNode.right) <= rootNode.key) {
       Node node = new Node(minValue(rootNode.right));
       return node;
    }
    
    
    Node leftResult = checkBSTValidity(rootNode.left);
    
    if (leftResult != null) {
       return leftResult;
    }
    
    return checkBSTValidity(rootNode.right);
    
}

提交上面的代码后,它显示:无效的树,左/右子节点链接到祖先,并且我的程序不产生任何输出。它还说:左子键大于父键的无效树不会返回正确的节点。任何帮助,将不胜感激!

编辑:对于挑战,它说要实现 checkBSTValidity() ,它将树的根节点作为参数并返回违反树的节点。违规节点将是以下三种情况之一:

  1. 祖先左子树中具有较小键的节点
  2. 祖先右子树中具有更大键的节点
  3. 左侧或右侧字段引用祖先的节点

主要问题是您的函数正在创建一个新的 Node 实例并返回该实例,而任务是返回树中已存在的节点。

但在评论中,您还提到该函数应该检查子节点是否与其祖先之一是相同的节点引用。您的代码中没有对此进行规定。我建议为此目的使用 HashSet,每次重复到其中一个子树时都可以向其中添加一个节点。

最后调用效率不高minValue and maxValue在每个节点上,这样您将多次访问节点,整个过程的时间复杂度为 O(????log????),而这可以用 O(????) 时间复杂度来完成。

一种想法是向递归调用传递一个“窗口”,该窗口必须包含子树中的所有值。最初这个窗口是无界的。如果键的数据类型是int,我们可以使用Integer.MIN_VALUE and Integer.MAX_VALUE作为窗口的边界。

下面是它的编码方式:

private static Node checkBSTValidity(Node rootNode, int low, int high,
                                     HashSet<Node> ancestors) {
    if (rootNode == null) {
        return null;
    }
    // Track each ancestor as we traverse down the tree
    ancestors.add(rootNode);
    // Any violation?
    if (rootNode.key < low || rootNode.key > high 
            || ancestors.contains(rootNode.left) 
            || ancestors.contains(rootNode.right)) {
        return rootNode;
    }
    // Check the sub trees
    Node node = checkBSTValidity(rootNode.left, low, rootNode.key, ancestors);
    if (node == null) {
        node = checkBSTValidity(rootNode.right, rootNode.key, high, ancestors);
    }
    ancestors.remove(rootNode); // Backtrack
    return node;
}

public static Node checkBSTValidity(Node rootNode) {
    HashSet<Node> ancestors = new HashSet<>();
    return checkBSTValidity(rootNode, Integer.MIN_VALUE, Integer.MAX_VALUE,
                            ancestors);
}

收集集合中的所有祖先可能看起来有些过分,但是需要跟踪所有祖先,以防树中允许重复的键。我们可以在树中建立一条路径,其中的节点都具有相同的键,并且子节点是对这些祖先之一的引用。在这种情况下,密钥不会违反 BST 属性,但仍应检测反向引用。

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

Java:如何返回破坏二叉搜索树的节点? 的相关文章

  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • Javadoc 1.5 和 1.6 中缺少 enum.valueOf(String name)

    这可能是一个愚蠢的问题 但我正在使用该方法enum valueOf String name 那里没问题 只是当我检查 javadoc 以了解有关此方法的更多信息时 我找不到它 有javadoc用于valueOf Class
  • 使用 Spring Data REST 处理自定义异常 (i18n)

    我正在使用 Spring Boot 1 5 4 和 Spring JPA Spring Data REST HATEOAS 我正在寻找一种最佳实践 Spring 方式 来自定义异常 Spring Data REST 正在管理添加 i18n
  • 使用 jpql 和 jpa 从日期字段中提取年份

    我想从数据库中的一行中提取年份部分 以便将其与值进行比较 这是我的功能 public List
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 是否可以从另一个方法传递 args[] 来调用 main 方法?

    我试图从另一个传递参数的方法调用类的主要方法 就像从命令行运行该类时一样 有没有办法做到这一点 您可以致电main方法就像您调用任何其他 静态 方法一样 MyClass main new String arg1 arg2 arg3 Exam
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • Google Place Api:来自此 Android 客户端应用程序 com.package.name 的请求被阻止

    我在用PlaceAutocompleteFragment当我单击搜索字段 PlaceAutocompleteFragment 对话框消失时 我收到此错误 errors domain global re ason forbidden mess
  • scala中的协变类型参数需要在java接口中保持不变

    我有一个看起来像这样的特征 一些进一步的信息可以在我自己提出了这个相关问题 https stackoverflow com questions 3695990 inheritance and automatic type conversio
  • H2 - (相当)长的 INSERT 失败,错误 42000

    H2 内存中 插入 错误 42000 尝试过版本 1 4 196 1 4 197 1 4 199 我还尝试在 H2 服务器 本地 上执行 INSERT 也失败 给出错误的行 抱歉 但出于安全原因 我无法生成更多 INSERT INTO tb
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor

随机推荐

  • 正确保存并更新单选按钮响应 java

    我正在尝试将单选按钮用户响应保存在 Firestore 中的 UID 下 我有两个选择yes and no到这个问题 它仅在用户按下按钮选择一个选项时起作用一次 但如果用户想要更改答案 它不会更新 替换旧响应 我想知道是否有人可以提供帮助
  • Python 长文件名支持在 Windows 中被破坏

    我编写Python脚本来复制文件 不幸的是 由于文件名太长 gt 256 它一直失败 有办法解决这个问题吗 我使用的是 Python 2 5 4 和 Windows XP Cheers Use 以字符串开头的路径 http msdn mic
  • IPv4 和 IPv6 禁止

    如果我想在我的网站上通过 IP 禁止用户 是否可以通过两者来实现IPv4 and IPv6 某些浏览器显然默认使用 IPv4 地址 而其他浏览器 如果有可能 则使用 IPv6 地址 因此 如果我通过某人当前的 IP 对其进行禁止 他们只需使
  • 解决MultisampleFramebufferAPPLE生成INVALID_OPERATION

    我不明白为什么glResolveMultisampleFramebufferAPPLE生成错误 1282 0x0502 GL INVALID OPERATION 设置代码 glGenFramebuffers 1 framebuffer gl
  • 为现有基于 MVC 的网站创建 REST API

    我有一个使用 ASP NET MVC3 开发的网站 我现在想公开一个 REST API 供其他人使用 它将公开与网站相同的功能 在网站中 一旦用户登录并根据数据库验证凭据 会话就会管理用户的登录状态 我如何使用 REST API 执行相同的
  • 在 PHP 中使用 getter 和 setter 代替函数或简单的公共字段有什么优点? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我不是 PHP 开发人员 所以我想知道 PHP 中以纯 OOP 风格使用私有字段 我喜欢的方式 使用显式 getter setter 的优点和缺
  • 保证金不起作用?两个元素之间需要空间

    首先 我很抱歉我没有把链接放在这里 这是一个工作网站 我不被允许 如果有必要 我会发布我的代码的相关部分 所以问题是非常基本的 我有一个带有一些图像的 div 和一个标题 h3 下面是我的内容开始的地方 无论我如何努力在两者之间创造一些空间
  • 在 if 语句/管理进程中使用 fork

    我有这段代码 printf L1 if fork 0 printf L2 if fork 0 printf L3 fork printf End n 作为练习 我试图找出运行此代码 而不实际运行它 所产生的有效 无效输出的一些示例 我仍然对
  • 在 Java 中将文件的前 N ​​个字节作为输入流读取?

    在我的一生中 我一直无法找到与我想做的事情相匹配的问题 所以我将在这里解释我的用例 如果您知道某个主题已经涵盖了该问题的答案 请随时引导我找到该主题 我有一段代码可以定期 每 20 秒 将文件上传到 Amazon S3 该文件是由另一个进程
  • React Hooks - 即使状态没有改变,useEffect 也会触发

    我在组件内设置了一个效果 如果另一个状态属性发生变化 它会更改视图 但由于某种原因 当组件安装时 效果会运行 即使值detailIndex没有改变 const EventsSearchList gt const view setView u
  • 为什么我在虚拟类和具体类中收到“未定义的符号... typeinfo ... vtable”?

    我正在重新学习 C 意思是 对我温柔点 我有一个超类 Node 与抽象方法 step 必须在子类 TestNode 它编译时没有错误 也没有任何警告 但链接它会导致 bash 3 2 g Wall o bin t1 src t1 cpp U
  • 在 Java 中从文件中解组 SOAP 信封

    我想对映射器对象进行单元测试 这些对象将 wsimport 生成的 Web 服务类型映射 转换到我自己的域对象中 我还想测试错误场景 例如 SOAP 错误等 并且我认为最好在真实的 SOAP 响应上测试映射器对象 我不想向 Web 服务本身
  • div id javascript中的自动递增数字

    有人能帮帮我吗 如何使用javascript在div ID中添加自动递增数字 我有四个 div 我希望通过 javascript 在 ID 中自动对它们进行编号 box1 box2 box3 box4 这是我的代码 div class so
  • 通过 Solrj 查询 Solr:基础知识

    我正在尝试在 Eclipse 中通过 solrj 查询 solr 我已经尝试过最新的solrj 维基 http wiki apache org solr SolJava例子 import org apache solr client sol
  • docker已满,所有inode都被使用

    遇到了很大的问题 我所有的索引节点似乎都被使用了 我已经清理了所有未使用的卷 清理所有容器和图像 使用命令 gt docker prune 但它似乎仍然满了 Filesystem Inodes IUsed IFree IUse Mounte
  • 实现自定义 ViewModifier,其中输出以具体视图类型为条件 (SwiftUI)

    我想创建一个 ViewModifier 其中输出以它正在修改的内容类型为条件 我管理的概念的最佳测试 使用 Text 和 TextField 作为示例视图类型 如下 struct CustomModifier
  • Java 8 groupingby 返回多个字段

    在 Java 8 中 如何对返回多个字段的单个字段进行分组 在下面的代码中 我传递名称和要求和的字段 在这种情况下为 总计 但是我想返回客户列表中每个 名称 的 总计 和 余额 字段的总和 可以是键和值作为数组的映射 可以通过使用单个 gr
  • VBA Microsoft.XMLHTTP setRequestHeader 不发送 cookie

    我的 VBA 代码发送除 Cookie 信息之外的所有标头 Dim oXMLHttpRequest As Object Set oXMLHttpRequest CreateObject Microsoft XmlHttp oXMLHttpR
  • 解压 pyspark dataframe 中的元组列表

    我想要解压 pyspark 数据框列中的元组列表 假设一列为 blue 0 5 red 0 1 green 0 7 我想分成两列 第一列为 blue red green 第二列为 0 5 0 1 0 7 Topic Tokens 1 blu
  • Java:如何返回破坏二叉搜索树的节点?

    研究一个应该返回破坏二叉搜索树的节点的方法 如果没有一个节点返回破坏二叉搜索树的节点 则返回 null 一些测试用例通过了 但其中一些失败了 我不确定为什么 到目前为止 这是我的代码 public static Node checkBSTV