递归执行广度优先搜索

2023-12-09

假设您想实现二叉树的广度优先搜索递归地。你会怎样做呢?

是否可以仅使用调用堆栈作为辅助存储?


(我假设这只是某种思维练习,甚至是一个技巧作业/面试问题,但我想我可以想象一些奇怪的场景,由于某种原因你不允许任何堆空间[一些非常糟糕的习惯]内存管理器?一些奇怪的运行时/操作系统问题?]而你仍然可以访问堆栈......)

广度优先遍历传统上使用队列,而不是堆栈。队列和堆栈的性质几乎相反,因此尝试使用调用堆栈(这是一个堆栈,因此得名)作为辅助存储(队列)几乎注定会失败,除非您正在这样做调用堆栈中的一些愚蠢可笑的事情是你不应该做的。

同样,您尝试实现的任何非尾递归的本质本质上都是向算法添加堆栈。这使得它不再在二叉树上进行广度优先搜索,因此传统 BFS 的运行时等不再完全适用。当然,您总是可以轻松地将任何循环转换为递归调用,但这不是任何有意义的递归。

然而,正如其他人所演示的,有一些方法可以以一定的成本实现遵循 BFS 语义的东西。如果比较的成本很昂贵但节点遍历很便宜,那么@西蒙·巴肯这样做,您可以简单地运行迭代深度优先搜索,仅处理叶子。这意味着堆中没有存储增长的队列,只是一个本地深度变量,并且随着树被一遍又一遍地遍历,堆栈在调用堆栈上一遍又一遍地构建。并作为@Patrick值得注意的是,无论如何,由数组支持的二叉树通常都以广度优先遍历顺序存储,因此对其进行广度优先搜索将是微不足道的,也不需要辅助队列。

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

递归执行广度优先搜索 的相关文章

  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 机器人探索算法

    我正在尝试为机器人设计一种算法 试图找到位于未知位置的旗帜 该旗帜位于一个包含障碍物的世界中 机器人的任务是夺取旗帜并将其带到他的基地 代表他的起始位置 机器人在每一步只能看到有限的邻域 他事先不知道世界是什么样子 但他有无限的内存来存储已
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 如何计算一组字符串的最短唯一前缀?

    这是一个非常常见的算法命令行解析 给定一组预定义的长选项名称 计算唯一标识这些选项之一的最短前缀 例如 对于以下选项 help hostname portnumber name polymorphic 这将是输出 he ho por n p
  • 查找数组中的重叠数据

    我们正在编写一个 C 应用程序 它将有助于删除不必要的数据重复器 只有在以下情况下才可以移除中继器 all它接收到的数据被其他中继器接收 我们第一步需要做的事情解释如下 例如 我有 int 数组的集合 A 1 2 3 4 5 b 2 4 6
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • javascript - 找到在一定限制下给出最大总和的子集(子集总和)

    我有一个包含一些整数值的数组 我需要获取它们的子集 该子集给出小于给定值的最大总和 假设我有这个数组 40 138 29 450 我想获得该数组的一个子集 使总和最大化 但低于用户给出的限制 比如说 250 在这种情况下 它应该返回 139
  • 单词预测算法

    我确信有一篇关于此问题的帖子 但我找不到提出这个确切问题的帖子 考虑以下 我们有字典可供使用 我们收到了许多单词段落 我希望能够根据此输入预测句子中的下一个单词 假设我们有几个句子 例如 你好 我的名字是汤姆 他的名字是杰瑞 他去了没有水的
  • 二分查找问题? [复制]

    这个问题在这里已经有答案了 可能的重复 实施二分查找有哪些陷阱 https stackoverflow com questions 504335 what are the pitfalls in implementing binary se
  • 如何发现“贪婪”算法?

    我正在读一本关于 贪婪 算法 但我很难发现它们解决真正的 顶级程序员 问题 If I know给定的问题可以用 贪婪 算法来解决 因此编写解决方案非常容易 然而 如果我没有被告知这个问题是 贪婪的 我就无法发现它 用 贪婪 算法解决的问题有
  • 数字总和直到作为输入给出的数字

    如果给出一个数字作为输入 则找到该数字之前所有数字的总和 例如输入 11 则答案为 1 2 9 1 0 1 1 蛮力方法是计算所有小于某个数字的数字的数字之和 我已经实现了该方法 我想知道是否有其他方法可以在不实际计算每个数字的数字之和的情

随机推荐

  • rpmbuild 的自定义 gradle 任务

    我们目前正在从 scons 转向 gradle 来构建我们软件的 java 部分 我们需要的一件事是从规范文件构建 rpm 因此 我们尝试编写自定义任务来执行 rpmbuild 以从规范文件构建 rpm 代码归结为 def rpmPath
  • React Router DOM 中多个 URL 的 NavLink 在同一链接上处于活动状态

    我有一个包含多个选项卡 子 的页面 我还更改了每个选项卡的 URL 但我仍在父页面上 只是更改了选项卡的 URL 问题是 当我单击选项卡时 我无法使父页面 NavLink 保持活动状态 因为它更改了 URL 但我想在选项卡 URL 上保持该
  • Objective C 将联系人添加到 iPhone 中的特定组

    我正在制作一个在地址簿中存储联系人的应用程序 我正在使用 Xcode 4 2 我知道如何在地址簿中添加联系人 假设我在联系人列表中有一个名为 A 的组 我想将此联系人添加到该组中 该怎么做 这是我正在使用的代码 ABAddressBookR
  • 在 MATLAB 中调整图像大小

    我正在尝试创建一个函数 根据家庭作业的值 scale zoom 缩放图像 我不想使用 MATLAB 内置函数resize 在此函数中 所以我尝试进行插值 任何帮助将不胜感激 这是我到目前为止所拥有的 function pic new sca
  • TCL 脚本:变量作为函数的参数

    我正在尝试使用 Amira 进行一些简单的脚本编写 它使用 TCL 但我不能保证它是标准版本 我想从一个对象读取属性并将其分配给另一个对象 在命令窗口中 过程如下 Image1 获取变换 0 1 0 2 0 3 0 0 0 0 0 0 1
  • liquibase 使用 Maven 和两个数据库

    我有以下结构来从 Maven 运行一个数据库
  • PHP 互斥(mutex)

    阅读一些有关 PHP 中锁定的文本 它们主要都是针对http php net manual en function flock php 本页讨论在硬盘上打开文件 真的是这样吗 我的意思是 这使得锁定非常昂贵 这意味着每次我想要锁定时我都必须
  • android 通过显式 TLS 进行 ftp 文件传输

    我在一遍又一遍地尝试让它工作但没有成功后发布这个问题 我尝试使用 apache commons 库在 android 中实现 FTP 文件传输 通信必须通过显式 TLS 身份验证完成 我可以成功登录 连接到服务器并列出文件 但每当我尝试获取
  • 如何在字符串中的字符串周围加粗两个单词,但不重叠句子?

    我需要将搜索词及其上下文 在句子中 加粗 考虑字符串 Lorem ipsum dolor 坐 amet 连接脂肪精英 如果搜索词是Lorem ipsum 那么结果应该是 Lorem ipsum dolor 坐阿梅特 连接脂肪精英 如果搜索是
  • C 中的 sizeof() 函数 [重复]

    这个问题在这里已经有答案了 main char a Visual C char b Visual C printf n d d sizeof a sizeof b printf n d d sizeof a sizeof b sizeof
  • C 库函数 fflush(stdin) 的替代方案

    谁能解释一下下面的代码是如何解释的 我真的不明白 while c getchar n c EOF 我知道它用于刷新输入流并且可以用标准 C 库函数替换 fflush stdin while c getchar n c EOF 这会读取输入字
  • AADSTS50020:租户中不存在用户帐户

    我能够将另一个租户创建的应用程序注册为我自己租户的企业应用程序 我以用户身份登录该应用程序 但收到以下错误 AADSTS50020 用户帐户 电子邮件受保护 来自身份提供商 https sts windows net aaaaaaaa bb
  • 如何将 std::string 转换为 double

    通常 当我用 C 编写任何内容时 我需要将char进入一个int我只是做了一个新的int等于字符 我使用了代码 片段 string word openfile gt gt word double lol word 我收到的错误是 Code1
  • 如何正确地将数据保存到数据库中?

    我通常将新数据保存到数据库中 如下所示 this gt MyTable gt set array id gt id code gt temp code status gt status age gt age location gt loca
  • 如何使用 iTextSharp 转换为 PDF

    ASP
  • 从 Parse.com 检索 PFFile 时“在解包可选值时意外发现 nil”

    当我检索 Parse com 中存储的 PFFile 时遇到问题 let user PFUser currentUser let userImageFile user profileImage as PFFile userImageFile
  • MQQueueManager消息池

    我过去使用 RabbitMq 作为 MessageQueue 当收到消息时触发事件非常简单 我查看了 IBM 安装程序提供的 NET 源代码 但发现处理它的方法不太好 查看示例 SimpleSubscribe 它做了这样的事情来池化 get
  • 如何维护数据库结构的修订控制?

    跟踪项目数据库结构更改的最简单方法是什么 当我更改数据库的某些内容 例如 添加新表 向现有表添加新字段 添加索引等 时 我希望将其传播到团队的其他成员 并最终传播到生产服务器 最小的麻烦和努力 目前 解决方案相当薄弱 并且依赖于人们记住做事
  • 为什么 TypeScript 无法从过滤数组推断类型?

    下面是一些示例代码 TypeScript 推断类型validStudents as Students 对于任何阅读代码的人来说 显而易见的是 因为所有无效记录都被过滤掉了 validStudents可以安全地被认为具有某种类型ValidSt
  • 递归执行广度优先搜索

    假设您想实现二叉树的广度优先搜索递归地 你会怎样做呢 是否可以仅使用调用堆栈作为辅助存储 我假设这只是某种思维练习 甚至是一个技巧作业 面试问题 但我想我可以想象一些奇怪的场景 由于某种原因你不允许任何堆空间 一些非常糟糕的习惯 内存管理器