递归执行广度优先搜索

2023-12-09

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

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


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

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

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

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

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

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

  • 使用区间树的最大区间重叠[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DPLL算法定义

    我在理解 DPLL 算法时遇到一些问题 我想知道是否有人可以向我解释它 因为我认为我的理解是不正确的 我理解的方式是 我采用一些文字集 如果每个子句都为真 则模型为真 但如果某些子句为假 则模型为假 我通过查找单元子句递归地检查模型 如果有
  • iOS心率检测算法

    我正在尝试在我正在开发的应用程序中实现心跳记录功能 首选方法是使用 iPhone 的摄像头 在灯亮的情况下 让用户将手指放在镜头上 然后检测视频源中与用户心脏相对应的波动 我通过以下堆栈溢出问题找到了一个非常好的起点here https s
  • 查找所有n位相邻数字为1的n位二进制数[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 让我用一个例子来解释一下 如果n 4
  • 如何计算python 2D散点占用面积

    我使用 matplotlib 绘制了这两个 2000 个点的序列 从图片上看 前2000点占用的面积比后2000点要小 但如果我想定量计算2000个点的第一序列和第二序列占用了多少面积 该怎么办 我真的很感谢任何帮助 建议或意见 非常感谢
  • 生成字符串及其子字符串列表的排列的算法

    我已经忘记这个算法有一段时间了 假设我得到了字符串 cccaatt 我试图生成重复字母的每个子串的所有可能变体 EG cccaatt 作为输入将返回 猫 卡特 猫 卡特 ccat 卡特 卡特彼勒 卡特彼勒 cccat cccat cccaa
  • 一种递归算法,用于在数组中查找总和为给定整数的两个整数

    我需要一个算法来确定数组是否包含两个总和为给定整数的元素 数组已排序 该算法应该是递归的并且运行时间为 O n 递归步骤应该基于总和 这意味着该方法传递总和并根据最终结果返回 true 或 false 如果找到两个元素 返回 true 否则
  • Numpy:具有特定条件的线性系统。无负解

    我正在使用 numpy 编写 Python 代码 在我的代码中 我使用 linalg solve 来求解 n 个变量中的 n 个方程的线性系统 当然 解决方案可以是积极的 也可以是消极的 我需要做的是始终有正解或至少等于 0 为此 我首先希
  • 找到不(必要)与二进制矩阵中的图像边界对齐的最大矩形

    我在用这个解决方案 https stackoverflow com questions 2478447 find largest rectangle containing only zeros in an nn binary matrix在
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • 当给定块大小时反转单链表

    有一个单连接链表 并给出了块大小 例如 如果我的链表是1 gt 2 gt 3 gt 4 gt 5 gt 6 gt 7 gt 8 NULL我的块大小是4然后反转第一个4元素 然后是第二个 4 个元素 问题的输出应该是4 gt 3 gt 2 g
  • 坐标算法 - 绕中心旋转

    通过查看这张图片 我想您会很好地理解我的问题 图片已删除 网址不再有效 现在返回广告 所以基本上我想要一个函数 它接受一个对象作为参数 并根据我之前添加的对象数量为该对象提供正确的坐标 假设我将所有这些对象添加到一个数组中 objectAr
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log

随机推荐

  • 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
  • 递归执行广度优先搜索

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