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:如何返回破坏二叉搜索树的节点? 的相关文章

随机推荐

  • 正确保存并更新单选按钮响应 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