检查二叉树是否是二叉搜索树的伪代码 - 不确定递归

2024-01-21

我的作业是编写伪代码来检查有效的二叉树是否是搜索二叉树。

我创建了一个数组来保存树的有序值。如果有序值按降序排列,则意味着它确实是 BST。但是,我在方法 InOverArr 中的递归方面遇到了一些问题。

我需要更新数组的索引,以便按照值在树中的顺序将值提交到数组。

我不确定索引在递归过程中是否真的正确更新..是不是?如果您发现一些问题可以帮我解决吗?多谢

伪代码

第一个功能

IsBST(节点)

大小 ← TreeSize(节点)

创建新数组 TreeArr,其大小为单元格数

索引 ← 0

几点评论: 现在我们使用带有小变化的 IN_ORDER 过程,我将该过程的新版本称为:InOrderArr InOrderArr的伪代码描述如下 IsBST

InOrderArr(节点,TreeArr,索引)

对于我从 1 到 size-1 做

如果不是 (TreeArr[i] > TreeArr[i-1]) 返回 错误的

返回真

第二个功能

InOrderArr(节点、数组、索引) 如果节点= NULL则返回

else

InOrderArr(节点.left,数组,索引)

treeArr[索引] = 节点.key

索引 ← 索引 + 1

InOrderArr(节点.right,数组,索引)

Return


您的代码通常是正确的。只需三个音符。

  1. 代码的正确性取决于实现,特别是取决于实现的方式index处理。许多编程语言按值将参数传递给子例程。这意味着子例程接收该值的副本,并且对参数所做的修改不会影响原始值。如此递增index在执行期间InOrderArr (node.left, Array, index)不会影响所使用的位置treeArr[index] = node.key。因此,只有最右边的路径会存储在数组中。
    为了避免这种情况,你必须确保index通过引用传递,因此被调用者完成的增量会提前调用者稍后使用的位置。

  2. BST 通常被定义为使得节点的左子树包含小于该节点的键的键,而右子树包含具有更大键的节点 - 请参阅 Wikipedia 的文章BST http://en.wikipedia.org/wiki/Binary_search_tree。然后中序遍历按升序检索键。为什么你期望降序排列?

  3. 删除数组并递归测试 BST 的定义条件可能会更有效吗?
    每当我们遵循一个left链接我们期望密钥小于当前密钥。每当我们遵循right链接我们期望密钥大于当前的密钥。因此,对于大多数子树来说,存在一些由某些祖先节点的键定义的键值间隔。只需跟踪这些键并测试该键是否落在当前有效区间内即可。确保处理树的最左路径上的“未定义左端”条件和最右路径上的“无右端”条件。在根节点处还没有祖先,因此根本没有测试根键(任何值都可以)。

EDIT

C代码草案:

    // Test a node against its closest left-side and right-side ancestors
    boolean isNodeBST(NODE *lt, NODE *node, NODE *rt)
    {
        if(node == NULL)
            return true;
        if(lt != NULL && node->key < lt->key)
            return false;
        if(rt != NULL && node->key > rt->key)
            return false;

        return
            isNodeBST(lt, node->left, node) &&
            isNodeBST(node, node->right, rt);
    }

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

检查二叉树是否是二叉搜索树的伪代码 - 不确定递归 的相关文章

  • 迭代和遍历有什么区别?

    过去几周我一直在学习迭代器 我仍然不明白迭代链接列表和遍历链接列表之间的主要区别 我知道遍历意味着遍历 访问每个元素 链接列表 并且在迭代时基本上做同样的事情 但是有什么不同 为什么不能遍历所有内容 标准库数据结构 遍历 只是意味着遍历数据
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • O(n^2) 与 O (n(logn)^2)

    时间复杂度是O n 2 or O n logn 2 better 我知道当我们简化它时 它就变成了 O n vs O logn 2 and logn lt n 但是关于logn 2 n is only less than log n 2 f
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • Python OO程序结构规划

    我是 OOP 的初学者 我想创建一个包含三个类 A B 和 C 的程序 该类的每个实例都由一组特征 Achar1 Achar2 等定义 该程序应该创建uses由 A 元素 B 元素和 C 元素以及开始日期和结束日期组成 A 和 B 都有子类
  • 在大文件中查找重复项

    我有一个非常大的文件 大约有 1500 万个条目 文件中的每一行都包含一个字符串 称为键 我需要使用 java 查找文件中的重复条目 我尝试使用哈希图并检测重复的条目 显然 这种方法向我抛出了 java lang OutOfMemoryEr
  • Python - 在大型数据集上计算多项概率密度函数?

    我原本打算使用 MATLAB 来解决这个问题 但内置函数有局限性 不适合我的目标 NumPy 中也存在同样的限制 我有两个制表符分隔的文件 第一个是显示内部蛋白质结构数据库的氨基酸残基 频率和计数的文件 即 A 0 25 1 S 0 25
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 二进制堆中的删除

    我只是想学习二进制堆 并对在二进制堆中执行删除操作有疑问 我读到我们可以从二进制堆中删除一个元素 并且需要重新堆化它 但在下面的链接中却显示不可用 http en wikibooks org wiki Data Structures Tra
  • PHP 时间间隔

    我正在寻找一个看起来应该非常简单的解决方案 但似乎我不能在这里找到任何好的答案 而且我自己似乎无法让它发挥作用 我正在寻找的是设置开始时间 结束时间 然后迭代给定时间间隔之间的一组时间 例如 上午 9 00 下午 5 00 是开始时间 这些
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • Java 中类似 HashMap 的可排序数据结构?

    Java 中是否有某种类似于 HashMap 的数据结构 可以按键或值排序 在 PHP 中 您可以拥有可排序的关联数组 Java中有这样的东西吗 HashMaps 几乎按照定义是未排序的 一个好的哈希函数会产生看似随机的密钥分布 如果你想使
  • Python:使用列表创建二叉搜索树

    我的代码的目标是从 txt 文件中获取每个单独的单词并将其放入列表中 然后使用该列表创建二叉搜索树来计算每个单词的频率 并按字母顺序打印每个单词及其频率 中的每个单词只能包含字母 数字 或 我无法用我的初学者编程知识来做的部分是使用我拥有的
  • NumPy“记录数组”或“结构化数组”或“recarray”

    NumPy 结构化数组 记录数组 和 记录数组 之间有什么区别 如果有的话 The NumPy 文档 http docs scipy org doc numpy user basics rec html暗示前两个是相同的 如果是 那么该对象
  • 如何防止 Nil 将容器恢复为其默认值?

    我正在实现一个简单的链表并表示没有下一个节点的事实 我正在使用该值Nil 问题是当分配给容器时 Nil将尝试将容器恢复为其默认值 这意味着我需要使用容器的默认值或Any确定是否已到达链表的末尾 不过 我还是想用Nil 如果只是为了其明确的意
  • 我的程序替换了链表中所有节点中的所有字符串数据类型

    我有一个程序 基本上将历史记录 节点 添加到员工记录 链接列表 中 这是我的代码 include
  • Java:数组和向量

    我习惯于使用 PHP 但最近我一直在使用 Java 并且试图解决这个问题让我很头疼 我想用 Java 保存这个表示 Array col name 1 gt Array 1 gt col value 1 2 gt col value 2 n
  • 修订:算法和数据结构

    我需要通过修订来构建和处理数据的想法 例如 我有一个对象数据库 例如汽车 每个对象都有许多属性 这些属性可以是任意的 因此没有一个固定的模式来描述这些对象 这些对象可能保存为键值对 现在我需要更改对象的属性 我不想完全重写它 我希望能够返回
  • 如何更新 Sencha Touch 中的嵌套列表/树存储?

    我有一个嵌套列表 必须根据用户在 Ext Carousel 中选择的内容填充新数据 TreeStore load newData this does not work TreeStore removeAll this works 似乎文档和
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树

随机推荐

  • 为外部承包商清理 Mercurial 存储库

    我有一个包含一些敏感文件和目录的活动项目 我想聘请外部承包商来做一些简单的 UI 工作 但是 我不希望承包商有权访问某些目录和文件 我的项目在 Bitbucket 上的 Mercurial 中 清理项目并让他有权提交更改的最佳方法是什么 我
  • ** 中的错误不是 NgModule

    我有这个 NgModule NgModule imports CommonModule exports SP21LoadingBar declarations SP21LoadingBar export class SP21LoadingB
  • 将 SQL Azure 数据库导出到 blob - Start-AzureSqlDatabaseExport:无法将 AzureStorageContainer 转换为 AzureStorageContainer

    我在用这段代码找到了 https stackoverflow com questions 36261258 start azuresqldatabaseexport object reference not set to an instan
  • 我如何知道Linux系统调用是否是线程安全的?

    Linux 中的一些函数通过 r 标记 线程安全 例如 gmtime r 但大多数系统调用都没有被标记 也没有在联机帮助页中提及 所以我的问题是 我如何知道Linux系统调用是否是线程安全的 谢谢你 我认为你的意思是 库函数 由于对线程的内
  • 将第一个函数中创建的数组传递给第二个函数

    这个问题是从我的上一个问题开始的 主要是因为我想避免使用全局变量 因为它的局限性 请参阅此处链接的答案 如何调用由不同函数创建的数组 https stackoverflow com questions 41436347 how do i c
  • 如何可靠地恢复 MySQL blob

    多年来我一直使用以下命令备份 MySQL 数据库 mysqldump myDatabaseName u root gt myBackupFile sql 备份似乎工作正常 然后我想将其中一个备份恢复到另一个命名的数据库 所以我这样做了 my
  • Qt5 在 OSX 上安装 -qt-xcb

    我在 OSX 上安装 Qt5 时遇到问题 The Mac OSX 的 Qt 要求 http qt project org doc qt 5 0 qtdoc requirements mac html完成 Xcode 和命令行已安装 然后我按
  • 使用 ctypes 将 python 字符串传递给 Fortran 子例程

    我正在尝试使用 ctypes 将参数传递给共享库中的 Fortran 子例程 现在这是我的简单 fortran 代码 MODULE test module INCLUDES SUBROUTINE fstr test file or exte
  • 用 C++ 构建多线程工作队列(消费者/生产者)

    我有以下场景 我有一个线程应该填充 带有整数对的容器 本质上是任务描述 我有一个很大的 应从此容器中获取元素并执行操作的工作线程数 8 16 一些工作 我认为这个问题可以通过阻塞队列轻松解决 例如在项目删除时 线程同步对队列的访问 如果没有
  • WPF DataTemplate 下的排序 ItemsControl

    我在 DataTemplate 下使用 ItemsControl 我想对 ItemsControl 进行排序ic使用 id 列
  • Unity3D C# 检查事件是否为空

    例如 DelegateHandler是我发送事件的地方 public class DelegateHandler MonoBehaviour public delegate void OnButtonClickDelegate public
  • 方法签名中的Java“参数”?

    在C 中 如果希望方法具有不确定数量的参数 可以将方法签名中的最后一个参数设为params这样方法参数看起来像一个数组 但允许使用该方法的每个人根据调用者的需要传递任意数量的该类型的参数 我相当确定 Java 支持类似的行为 但我不知道如何
  • 查找子字符串,带有一些附加条件

    我得到了一个如下所示的字符串 1011010100 我的任务是找到一个子字符串的长度 其中空值的数量始终 10110101 gt 8 我知道复杂度应该是 O n 或 O n log n 因为长度最多可达 10 6 有任何想法吗 The O
  • 在 Android 上,我可以注册一个回调来告诉我蓝牙是否打开或关闭吗?

    我需要知道我的应用程序内部蓝牙是否打开或关闭 或者蓝牙是否打开或关闭 例如从操作系统设置下拉菜单 我想我可以在活动中做到这一点onResume 但事实证明 当 Android 操作系统的设置 下拉菜单 通过用手指从屏幕顶部边缘下拉来访问的菜
  • 用于计算类数的部分语法

    我需要计算正确的 C 源文件中的类数量 我写了以下语法 grammar CSharpClassGrammar options language CSharp2 parser namespace CSharpClassGrammar Gene
  • H2 表列在双引号中不区分大小写

    我正在开发一个工具 它将数据导入到动态生成的模式中 因此 我几乎无法控制表或列名称的外观 我最近遇到了在表中创建两列名称相同但大小写不同的问题 这个问题可以通过这个最简单的 DDL 操作来演示 CREATE TABLE a c1 integ
  • 尝试使用 BayesSearchCV 调整 MLPClassifier hide_layer_sizes 时出错

    当尝试调整 sklearn 时MLP分类器hidden layer sizes超参数 使用贝叶斯搜索CV 我收到错误 ValueError can only convert an array of size 1 to a Python sc
  • Android在哪里存储SQLite的数据库版本?

    我无法找到 Android 在 SQLite 数据库文件中存储数据库版本的位置 数据库版本到底存储在哪里 您可以使用以下方式阅读版本android database sqlite SQLiteDatabase getVersion 在内部
  • appcompat 库样式如何工作

    我对 appcompat 库中的样式如何工作感到非常困惑 根据here https chris banes me 2014 10 17 appcompat v21 我们现在使用 Toolbar ActionBar 的支持实现 平台意味着我们
  • 检查二叉树是否是二叉搜索树的伪代码 - 不确定递归

    我的作业是编写伪代码来检查有效的二叉树是否是搜索二叉树 我创建了一个数组来保存树的有序值 如果有序值按降序排列 则意味着它确实是 BST 但是 我在方法 InOverArr 中的递归方面遇到了一些问题 我需要更新数组的索引 以便按照值在树中