检查二叉树是否也是二叉搜索树的问题

2023-11-22

我正在尝试解决这个问题,但遇到了一些麻烦:

在二叉搜索树 (BST) 中:

  • 某个节点的左子树中每个节点的数据值都小于该节点的数据值。
  • 节点右子树中每个节点的数据值都大于该节点的数据值。

给定根节点:

class Node {
    int data;
    Node left;
    Node right;
}

判断二叉树是否也是二叉搜索树

我有这个代码:

boolean check(Node root) {   

    //node doesn't have any children
    if (root.left == null && root.right == null) {
        return true;
    }

    boolean leftIsBst = true;
    boolean rightIsBst = true;

    if (root.left != null) {
        leftIsBst = (root.left.data < root.data) && check(root.left);
    }

    if (root.right != null) {
        rightIsBst = (root.right.data > root.data) && check(root.right);
    }

    return leftIsBst && rightIsBst;
}

这在某些情况下有效,但在以下情况下会失败:

enter image description here

如您所见,节点(4)位于节点中(3)的左子树,虽然 4 大于 3,所以该方法应该返回false。我的代码返回true, 尽管。

我怎样才能控制这个案子?如何检查左/右子树中的所有值是否低于/大于根(不仅仅是直接子树)?


您的定义是正确的(尽管您不一定需要坚持所有键都是不同的),但您的代码并未实现定义中的所有条件。具体来说,您不会强制每个子树中的最小值和最大值。

这是一个实现您的定义的有效递归解决方案:

boolean check(Node root) {
    return check(root, INT_MIN, INT_MAX);
}
boolean check(Node n, int minval, int maxval) {
    if (n == null) {
        return true;
    }
    return (
        n.data >= minval && n.data <= maxval &&
        check(n.left, minval, n.data-1) &&
        check(n.right, n.data+1, maxval)
    );
}

请注意,我没有费心检查溢出n.data-1 and n.data+1,这是你在现实生活中必须做的。如果你想允许重复的键,只需将它们更改为n.data你不必担心它。

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

检查二叉树是否也是二叉搜索树的问题 的相关文章

随机推荐

  • Spring Boot Jackson 日期和时间戳格式

    application yml配置 jackson date format yyyy MM dd timestamp format yyyy MM dd HH mm ss serialization write dates as times
  • 这是从文件中读取行并将其拆分为 Rust 中的单词的正确方法吗?

    编者注 此代码示例来自 Rust 1 0 之前的版本 在语法上不是有效的 Rust 1 0 代码 此代码的更新版本会产生不同的错误 但答案仍然包含有价值的信息 我已经实现了以下方法来以二维数据结构返回文件中的单词 fn read terms
  • 缓慢图像缩放的数学

    我有一个带有漫画书布局的 bmp 图像 目前我的代码是这样工作的 如果我右键单击并按住鼠标按钮 我可以在漫画书页面上的一个框架周围绘制一个选取框类型的框 当我释放按钮时 它将放大到该框架 但它是即时的 我希望它有动画效果 因此 不要将 Pi
  • 如何实现 ContentProvider 来向 Gmail、Facebook、Evernote 等提供图像

    我之前的问题 是否可以通过数据 URL 在 Android 上共享图像 与这个问题相关 我已经弄清楚如何在没有将文件写入外部存储的权限的情况下将图像从我的应用程序共享到另一个应用程序 但是 我仍然遇到一些问题行为 当我尝试从手机 Andro
  • 禁用特殊目录上的某些 php 功能

    我想禁用执行一些 php 函数 例如file put content exec eval在特殊目录上 我可以用disable functions在 php ini 中 但如何定义一个特殊的文件夹 例如c poject public 如果您的
  • 解析日期时间格式以获取格式字符串

    我希望能够得到格式字符串来自日期时间字符串 e g 2012 12 08 15 00 00 gt yyyy MM dd HH mm ss 2013 30 01 16 00 gt 年 日 月 时 分 这可能吗 以完全通用的方式很难做到这一点
  • 通过邮件发送 PDF 文件或提供应用程序直接查看文件

    我的 Android 4 应用程序可以创建 PDF 格式的不同报告 我想为用户提供通过邮件发送文件或在任何可以处理 PDF 文件的应用程序中打开文件的选项 目前我使用以下代码 Intent intent new Intent Intent
  • Pandas:根据目标分布从 DataFrame 中采样

    我有一个包含数据集的 Pandas DataFrameD都有一些连续值的实例x x以某种方式分布 比如统一 可以是任何东西 我想画画n样本来自D为此x有一个我可以采样或近似的目标分布 这是来自一个数据集 这里我只取正态分布 我如何从中采样实
  • mkmf 编译 C 扩展时会忽略子文件夹中的文件

    我想这样组织 C 源代码 ext native extension lib Source files are kept in here may contain sub folders native extension c native ex
  • ListBox DrawItem HotLight 在 OwnerDraw 模式下状态?

    我在用着OwnerDrawFixed作为我的 WinForms 应用程序中自定义 ListBox 控件的 DrawMode 当用户将鼠标悬停在列表框项上时 即在 MouseMove 上 我想重新绘制 ListBoxItem 的背景 或执行其
  • 使用向量来索引没有线性索引的矩阵

    你好 我正在尝试找到一种方法来使用 x y 点向量从 MATLAB 中的大型矩阵进行索引 通常 我会将下标点转换为矩阵的线性索引 例如使用向量作为矩阵的索引 但是 矩阵是 4 维的 我想获取具有相同第一维和第二维的第三维和第四维的所有元素
  • 全程锁定 iPhone 应用程序方向

    我收集最新版本的 iOS 中改变的方向方法 并且我没有使用 UIWebView 有没有办法将整个应用程序锁定为纵向模式 或者我是否必须强制每个视图控制器 在 iOS 7 中 您只能在项目 gt 常规 gt 部署信息中检查纵向
  • NodeJS npm 安装 pg 失败

    我尝试在我的 ubuntu 虚拟机上 npm install pg 但出现错误 gt email protected install usr local lib node modules core node modules pg gt no
  • 如何解决这个问题:在 logcat -->> 加载 /system/media/audio/ui/Effect_Tick.ogg 时出错?

    我有个问题 error loading system media audio ui Effect Tick ogg 当我单击 navdraw 图标时会显示它 有人可以帮助我吗 这是 logcat 上的错误 04 20 01 42 11 24
  • 有没有办法在我的 WPF 应用程序中使用 ODTTF 字体文件?

    创建 XPS 文件时 它会将原始文档的字体子集化并混淆为 ODTTF 字体文件 并将它们捆绑在 XPS 文件中 这只是一个 zip 文件 因此很容易提取它们 我已提取其中一个 ODTTF 文件 并将其作为资源包含在我的 WPF 应用程序中
  • Scala的模式匹配是否违反了开闭原则?

    如果我添加一个新的案例类 这是否意味着我需要搜索所有模式匹配代码并找出需要在哪里处理新类 我最近一直在学习这门语言 当我读到一些支持和反对模式匹配的论点时 我对应该在哪里使用它感到困惑 请参阅以下内容 Pro Odersky1 and Od
  • Azure DocumentDb 错误“查询必须计算为 IEnumerable”

    我在尝试检索单个记录时尝试查询我的 Azure DocumentDb 存储帐户时遇到问题 这是我的 WebAPI 代码 Controller public AccountController ApiController other acti
  • 解压并读取杜高斯贝.bi5刻度文件

    我需要打开一个 bi5文件并阅读内容 长话短说 问题 我有数以万计的 bi5包含我需要解压缩和处理 读取 转储到 pandas 的时间序列数据的文件 我最终安装了Python 3 我通常使用2 7 专门用于lzma库 当我使用lzmaPyt
  • 单击链接时 InstantApp 未启动

    我的测试应用程序已在 Google Play alpha 中的测试封闭轨道中发布 但我也尝试过内部测试 得到相同的结果 修复缺少的默认 URL 后 它已经显示了 立即尝试 按钮 assetlinks json放置在我的服务器上的正确位置 应
  • 检查二叉树是否也是二叉搜索树的问题

    我正在尝试解决这个问题 但遇到了一些麻烦 在二叉搜索树 BST 中 某个节点的左子树中每个节点的数据值都小于该节点的数据值 节点右子树中每个节点的数据值都大于该节点的数据值 给定根节点 class Node int data Node le