如何通过 BFS 和 DFS 遍历构建树

2023-12-31

我有BFS and DFS树的遍历。如何从这些遍历中重建树?

例如:

BFS Traversal : 4 3 5 1 2 8 7 6

DFS Traversal : 4 3 1 7 2 6 5 8

那么树就会像下面这样:

       4
      / \
     3   5    
    / \   \    
   2   1   8
   |   |         
   6   7      

这只有在使用 BFS 和 DFS 时才有可能exactly遍历子节点的顺序相同:

Rule 1:

BFS Traversal : 4 3 5 1 2 8 7 6
                | | |
                | | |-------|
                | |         |
DFS Traversal : 4|3 1 7 2 6|5 8

正如这个例子所示,我们很容易知道(3 , 1 , 7 , 2 , 6)属于以 3 作为根的子树。由于 1 也是该子树的一部分,因此我们可以得出 3 和 5 是 4 的唯一子节点。

Rule 2:

BFS Traversal : 4 3 5 1 2 8 7 6
                | |   |
                | | |-|
                | | |        
DFS Traversal : 4 3 1 7 2 6 5 8

这样,我们就可以证明 3 和 5 是 4 的孩子。

这也可以仅使用包含属于同一子树的节点的 BFS 和 DFS 子集来完成(此示例是在规则 1 的演示中找到的子树):

使用规则 1:

BFS Traversal: 1 2 7 6
               | |
               | |-|
               |   |
DFS Traversal: 1|7|2 6

这表明 7 是 1 的唯一孩子。

使用规则 2:

BFS Traversal: 1 2 7 6
               |   |
               | |-|
               | |  
DFS Traversal: 1 7 2 6

因此 1 和 2 是同一个父对象的子对象(即 3)。

翻译成伪代码将如下所示:

addchild(int parent, int child) := add the child to the specified parent node

void process(int[] bfs , int[] dfs)
    int root = bfs[0]

    //find all peers (nodes with the same level and parent in the tree) using Rule 2
    int at = bfs.find(dfs[2])
    int peers[at - 1]
    for int i in [1 , at[
        peers[i - 1] = bfs[i]
        addchild(root , bfs[i])

    //for each of the childtree of the tree find it's children using Rule 1
    for int i in [0 , length(peers)[
        //all nodes that are either peers[i] or a child of peers[i]
        int[] children_dfs = dfs.subset(dfs.find(peers[i]) , (i < length(peers) - 1 ? dfs.find(peers[i + 1]) : length(dfs)) - 1)
        //a subset of bfs containing peers[i] and it's children in the order they have in bfs
        int[] children_bfs = bfs.allMatchingInOrder(children_dfs)

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

如何通过 BFS 和 DFS 遍历构建树 的相关文章

  • 如何跳过财务图中的空日期(周末)

    ax plot date dates dates highs lows 我目前正在使用此命令来绘制财务高点和低点Matplotlib http en wikipedia org wiki Matplotlib 效果很好 但如何删除 x 轴上
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何使用 PyQtGraph 提高速度并通过多个图分割数据?

    我正在使用 STM32 套件从串行端口读取数据 问题是我需要使用自己的时间戳来绘制 ADC 数据 这意味着 x 轴应该是我的 RTC 时间 使用毫秒 y 轴是 ADC 数据 有用于绘制串行端口的程序 但正如我所说 我需要为图表设置自己的时间
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

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

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

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

    需要递归函数 系列是 1 2 3 3 4 5 4 5 6 7 递归求 n 的级数之和 我无法想到应该在函数中传递哪些参数 我的方法 我认为我应该传递 n 要相乘的项数 但我无法想到的是我应该如何在同一个函数中 和 以及我的 return 语
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 创建将 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
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它
  • 模式识别算法

    过去我必须开发一个充当规则评估器的程序 你有一个先行词和一些后续词 动作 所以如果先行词评估为真 则执行的动作 当时我用的是修改版RETE算法 http en wikipedia org wiki Rete algorithm RETE 有
  • 为每个英文单词生成唯一序列号的算法

    对于应用程序 我需要为每个英语单词生成唯一的序列号 最好的方法是什么 一个限制是序列号生成算法应该在普通台式计算机中非常有效 Thanks 你有所有可能的单词的列表吗 如果是 则从第一个字的 0 开始 每个字将序列号加 1 如果不是 那么保
  • 单词预测算法

    我确信有一篇关于此问题的帖子 但我找不到提出这个确切问题的帖子 考虑以下 我们有字典可供使用 我们收到了许多单词段落 我希望能够根据此输入预测句子中的下一个单词 假设我们有几个句子 例如 你好 我的名字是汤姆 他的名字是杰瑞 他去了没有水的
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 线性问题和非线性问题之间的区别?点积和核技巧的本质

    核技巧将非线性问题映射为线性问题 我的问题是 1 线性问题和非线性问题的主要区别是什么 这两类问题的差异背后的直觉是什么 核技巧如何帮助在非线性问题上使用线性分类器 2 为什么点积在这两种情况下如此重要 Thanks 当人们说到分类问题的线
  • 期望最大化算法的数值示例[重复]

    这个问题在这里已经有答案了 由于我不确定给出的公式 有人可以提供 EM 算法的简单数字示例吗 一个非常简单的具有 4 或 5 个笛卡尔坐标的坐标就可以了 那这个呢 http en wikibooks org wiki Data Mining

随机推荐

  • 共享除前缀之外的所有地点或如何使用 PlaceHistoryMapperWithFactory

    在我的 gwt app 中 我有一些地方共享除前缀之外的所有内容 例如 editUserPlace 和 showUserPlace 在这种情况下 状态由 userId 确定 我当前的尝试是通过 ShowUserPlace 和 EditUse
  • GCP 托管实例组不会扩展到零

    我有一个 GCP 托管实例组 我想使用 cron 计划将其扩展至 0 到 1 个实例 GCP 有一个局限性 https cloud google com compute docs autoscaler scaling schedules l
  • 单击正文,但其他一些标签不起作用

    有谁知道 css 位置 相对 可能会搞乱功能 body not theDIV click function alert 或者问题出在其他地方 发生的情况是 我有一个在单击按钮时出现的图标 并且当我单击主体上除 div 本身之外的任何位置时
  • 为什么我的 Gunicorn Python/Flask 工作人员会退出信号术语?

    我有一个 Python Flask Web 应用程序 我正在通过 Gunicorn 将其部署在 Amazon ECS 上的 Docker 映像中 一切都很顺利 然后突然间 包括最后一次成功的请求 我在日志中看到了这一点 2017 03 29
  • 如何将 ctx(上下文)传递给 CliRunner?

    CliRunner未列出任何参数来在其中提供上下文文档 http click pocoo org 5 api click testing CliRunner invoke 以下内容应作为最低限度的工作示例 真正的问题有点不同 可以通过将单击
  • 使用 EditText 显示密码

    我使用 EditText 输入密码 以及一个用于显示密码或不显示密码的复选框 下面是函数的一部分 public void ShowPassword if cb isChecked password setInputType InputTyp
  • tabBar didSelectItem 似乎不起作用

    在我的头文件中我有这个 interface TabBarController UIViewController
  • PHP 将 XML 转换为 JSON

    我正在尝试在 php 中将 xml 转换为 json 如果我使用简单的 xml 和 json encode 进行简单转换 则 xml 中不会显示任何属性 xml simplexml load file states xml echo jso
  • Angular.json 脚本未加载

    我正在尝试使用bootstrap导航栏的示例来自bootstrap文档 如果我从以下位置加载它angular json切换汉堡不起作用 如果我使用的是来自的 CDN 链接bootstrap docs
  • 要求文件作为字符串

    我正在使用 Node Express 我只是想知道如何将任何文件作为字符串导入 假设我有一个 txt 文件 我想要的只是将其加载到这样的变量中 var string require words txt 我反对 modules exports
  • Android 模拟器 - 创建用户帐户时遇到问题

    我的 Android 模拟器中需要一两个用户帐户 以便我可以测试应用程序的一些短信 邮件功能 问题是 当我尝试在模拟器中执行此操作时 设置 gt 帐户和同步 gt 添加帐户 gt my gmail account password gt 下
  • AngularJS Protractor - 如何测试 AJAX 登录调用?

    我有一个按钮 单击后会在 Angular 中发出 AJAX 调用 promise格式 登录成功后会出现 scope变量被更改并且元素如下所示 section Section to display if logged in section 被
  • 安装 Oracle Database Express Edition 11g 时出现问题

    我正在尝试使用 X ubuntu 13 04 64 位安装 Oracle 数据库本指南 http www techienote com 2012 11 step by step guide to install oracle databas
  • 使用 jdk 1.7 启动 Apache James

    我尝试在 Linux Mint 64 位 Debian 上使用 Java jdk 1 7u17 运行 apache james 3 0 beta4 服务器 但由于 JAXB 库错误而无法工作 根据文档 应下载不同的 jar 文件 http
  • 8086组装师

    我在下面的代码中遇到了这个问题 该代码将数字转换为 ASCII 数字文本 然而 代码似乎在 div 操作码处循环 Main Program main mov ax 0x0000 mov ds ax setup data segment re
  • 使用 JSONPath 进行 Redshift COPY 缺失的数组/字段

    我正在使用 COPY 命令将 JSON 数据集从 S3 加载到 Redshift 表 数据正在部分加载 但它会忽略缺少数据 键值 数组 的记录 即从下面的示例中仅加载第一条记录 Query 从 s3 mybucket address jso
  • 无符号整数的差异 - 获取签名结果的标准支持方法?

    假设两个任意时间戳 uint32 t timestamp1 uint32 t timestamp2 除了转换为更大的有符号类型和相当冗长的 if else 的明显变体之外 是否有标准的一致方法来获得两者的有符号差异 事先不知道哪一个更大 但
  • 研究squashfs压缩比

    是否有任何工具可以检查现有的 squashfs 映像并找出每个文件的压缩率 如果它可以帮助我估计一个巨大的可执行文件中静态链接符号的闪存使用情况 那就加分了 7zip 程序可以提供该信息 使用7z l slt squasfsfile您将获得
  • selenium切换到iframe来定位元素

    selenium import webdriver from selenium webdriver support import expected conditions as EC from selenium webdriver suppo
  • 如何通过 BFS 和 DFS 遍历构建树

    我有BFS and DFS树的遍历 如何从这些遍历中重建树 例如 BFS Traversal 4 3 5 1 2 8 7 6 DFS Traversal 4 3 1 7 2 6 5 8 那么树就会像下面这样 4 3 5 2 1 8 6 7