【问题标题】:Can I implement iterator in binary search tree without stack?我可以在没有堆栈的二叉搜索树中实现迭代器吗?
【发布时间】:2020-10-06 00:02:05
【问题描述】:

假设我有二叉搜索树。每个节点都有两个指向子节点的指针,没有指向父节点的指针。

有没有不使用堆栈或队列来实现迭代器的有效方法?

高效是指能够以 O(1) 复杂度找到下一个元素。

【问题讨论】:

  • 我猜即使使用堆栈,你能得到的最好结果也是 O(1) amortized 复杂度。
  • 莫里斯遍历?
  • @vivek_23 不错,但对我来说没有任何好处。
  • @Nick 节点的下一个后继节点很难获得,但是如果您希望为一个节点存储的数据多于 2 个子节点,那么可以选择。
  • 如果这是一个要求,那么应该在您的问题中提及。但请注意,通过 Morris 遍历,一旦迭代器被完全消耗,树将恢复到其原始状态。

标签: c++ algorithm iterator


【解决方案1】:

想象一棵高度为 h 的完美树。当迭代器位于第一个节点(最左边的叶子)时,它需要以某种方式记住它是通过哪些内部节点到达该节点的,因为在接下来的一个步骤中,它需要在这些节点(以及它们的右子树)。由于没有父节点指针,因此该信息不易获得,必须存储在某处。

无论这条路径如何被记忆(内部节点列表,或方向列表,如左-左-左-左,可能以位表示形式紧凑存储),此存储的理论大小为 O( H)。

如下面的 cmets 所述,仅存储方向将需要在迭代的每一步从根再次沿着路径走下去。或者,您可以记住上次访问的值,并使用二进制搜索来查找下一个节点。如果树中的所有值都是唯一的,那么实际值的内存大小将至少具有与紧凑路径表示(按位左-左-左...)相同的数量级,因此无论哪种方式(存储路径,或上次访问的值)存储要求类似。

现在,一旦您对树的大小进行了一些限制,那么谈论空间(或时间)复杂性当然就没有意义了。例如,如果一棵树的高度永远不会超过 64,那么当前路径可以用 64 位无符号整数表示,可能还有一些额外的小整数来表示该路径的当前大小。

由于可观测宇宙中的原子数估计为 2250,因此您也可以使用它,并改用 256 位无符号整数(两个长整数)。无论如何,计算机内存都无法存储这么高的完美树。

【讨论】:

  • 您如何处理左/右方向列表?我不认为你可以用那个实现一个摊销的 O(1) 迭代器......
  • 您可以始终在您的迭代器中保留最后一次迭代的键 - 这是 O(1) 存储,并允许您确切知道下一个要访问的节点是什么。但是如果没有父指针,你仍然必须从根开始,所以它需要超过 O(1) 步骤。
  • @ciamej,我当然同意。我专注于空间复杂性,您的第二条评论是有道理的。无论哪种方式,都没有办法不改变树以在 O(1) 获得时间和空间复杂度。
  • 还有一条评论。如果存储值被认为是 O(1) 空间,那么按位路径表示也应该被认为是 O(1),至少当树保存唯一值时。完美树中不同值的数量是 2^h - 1,这与路径表示的数量相同...
【解决方案2】:

总结一下:迭代器应该有一个小的尺寸(独立于树的大小),并且树节点中也没有额外的信息。此外,树可能以任何方式不平衡。

在这种情况下,根据鸽巢原理,答案必须是。问题是,在处理完最后一个节点之前,无法预测剩余的节点数量以及它们之间的关系。确实有无数种选择,但直接可用的信息是有限的。

【讨论】:

  • 我不相信这种逻辑(尽管我相信答案 no 是正确的)。您没有触及 O(1) 要求,如果没有该要求,构建适当的迭代器相当容易。
  • @ciamej:O(1) 要求反映了“直接可用信息”。您始终可以返回根目录并重建未存储在迭代器对象中的堆栈,但这是一个 O(log N) 过程来收集迭代器中不直接可用的信息。
  • re:“直接可用的信息” - 我以前没有遇到过这样的术语。我宁愿根据渐近记忆和处理步骤界限来分析它。 O(1) 内存和 O(1) 处理步骤是不可能的。可能的 O(1) 内存和 O(log n) 处理步骤(对于平衡树)。可能的 O(log n) 内存和分摊的 O(1) 处理步骤(同样适用于平衡树)。
  • 我在std::set红黑树中检查了他们是如何做到的——那里他们有指向父级的指针。
  • @Nick:搜索算法没有什么不同,但复杂度不同。红黑树的搜索复杂度为 O(log N),但普通二叉树的边界为 O(N)。
猜你喜欢
  • 2017-05-09
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多