【问题标题】:Rerooting on Euler Tour Tree在 Euler Tour Tree 上重新生根
【发布时间】:2016-01-07 05:39:13
【问题描述】:

我最近了解了这种称为 Euler Tour Tree 的数据结构,它解决了树上的动态连接问题。如果您不了解此数据结构并希望学习,请查看此link 我在理解 reroot 过程时遇到问题。树中的每个节点都必须存储指向所表示的欧拉循环序列中第一个和最后一个节点的指针。在其他操作中,这些值将如何变化是显而易见的,但在重新根过程中,位置可能会发生高达 O(n) 的变化,因此这些值也会发生变化。有人可以帮我看看这个吗?

【问题讨论】:

  • 你在斯坦福大学花了很多钱。我相信您的 CS166 教授会很乐意为您提供帮助。
  • 呃,不,我不在斯坦福。我刚刚用谷歌搜索了它。
  • 你找到答案了吗?
  • 我很久以前就放弃了寻找。我只是在为即将举行的奥运会做准备。
  • 链接幻灯片(以及互联网上的其他幻灯片)的问题是:它有一个错误:web.stanford.edu/class/cs166/lectures/05/Slides05.pdf

标签: data-structures


【解决方案1】:

树中的每个节点都必须存储指向所表示的欧拉环序列中第一个和最后一个节点的指针。

这是错误的。您只需要存储指向任何顶点表示的指针。并且您必须将 2 个指针从边缘存储到树中的两个(两个方向)边缘。 在 O(log n) 中更新树是可能的。

【讨论】:

  • 但是确定两个节点是否在公共树中需要 O(n),不是吗?
  • 没有。当树的欧拉之旅保存在二叉搜索树中时,需要 O(log n) 来确定两个节点是否在同一棵树中。 (欧拉之旅树的根是第一个和最后一个节点,在 BST 中,您只需在树中向上而不是向右或向左。2*高度 O(log n) => O(logn) )
  • 我明白了。非常感谢您的帮助!
【解决方案2】:

实际上,新根和旧根的指针确实会发生变化。假设您将指向每个节点的第一次和最后一次出现的指针存储为指向平衡二叉搜索树 (BST) 中用于表示欧拉之旅的节点的指针。无论您使用此 BST(旋转、拆分或合并)做什么,节点本身都不会改变(它们的左右子节点等字段确实会改变,但节点本身仍然有效),因此无需更改指向它们的指针,除非完全删除节点或创建新节点。但是每个操作只有O(1) 节点删除/创建。因此,只需要更新O(1) 指针。

【讨论】:

  • 确实只有 O(1) 节点删除/创建。但是由于节点是旋转的,它们可能会改变它们相对于其他通道的位置。例如,第一个和最后一个可能交换位置,或者可能有一个先前位于中间但移动到最后一个位置的节点。所以该节点现在将是最后一个节点。我仍然不明白我们该如何解决这个问题。
  • 例如,高度为 3 且节点按字母顺序排列的完整二叉树的欧拉之旅将是: ABDBEBACFCGCA 当前 A 是根节点。假设我们旋转树,使 E 成为根节点。然后欧拉之旅将变为: EBDBCFCGCABE 第一个/最后一个指针改变的节点是 A,B,E。那么我们如何解释这些变化呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多