【问题标题】:Is using an iterator to clone a BST faster than recursion?使用迭代器克隆 BST 是否比递归更快?
【发布时间】:2011-11-29 21:51:54
【问题描述】:

我有一个关于二叉树设计原则的问题。

我需要创建二进制表达式树的深层副本,我通过遍历树中的所有节点并创建一个新的相同节点来完成此操作。

我已经为其他用途设置了一个 treeIterator,并且想知道迭代器是否会更快、更慢,或者与递归执行它的速度/内存使用量大致相同。

谢谢!

【问题讨论】:

  • 你也有上一个/下一个链接?
  • 在这种情况下,使用递归(或堆栈)复制会更好,因为在新树中添加新节点将是 O(1) 而不是 O(logN) [前提是你不需要重新平衡它]

标签: java clone binary-tree deep-copy


【解决方案1】:

我认为递归会更快。

我不知道您的迭代器的确切实现,但我假设它会到达每个节点?如果您的 BST 基于根节点结构,那么访问每个节点(如在迭代器中)将比递归慢。

这是我将如何实现它:

递归地, 创建一个新的根节点(与原始根节点相同)。 添加原始根的左右节点的副本。 (如果存在)

【讨论】:

  • 只有当所讨论的迭代器不够聪明而无法进行有序遍历时才会这样......
  • 我不知道他是怎么实现的……所以我建议递归。
  • 啊,现在我们有了信息——没有父链接,所以递归可能是唯一的方法。
【解决方案2】:

有两个部分:(1) 遍历树和 (2) 创建一个新的树副本。我假设迭代是指手动维护树中位置的循环。这可能比递归更快/更少内存。但是,在构建新树时,最好使用递归并在遍历树时构建树。如果您迭代并将节点插入到将花费 O(n lg n) 的新树中。另一方面,递归只需要 O(n),尽管你可能会在非常深的树上炸毁你的堆栈。

【讨论】:

    【解决方案3】:

    您没有指定如何实现迭代器。迭代器只是一个接口,不是具体的实现。

    在 BST 中搜索需要 O(log n) 时间,这意味着在任何时间点,查找下一个节点都需要 O(log n) 时间。

    说明: 下一个节点总是右子树中的最小元素或当前节点的父节点。无论如何,它不会超过 log n 时间。

    除非您的迭代器实现花费少于 O(log n) 时间,否则递归会更快。

    编辑:我需要指出,这里的 O 表示法是针对一般情况,而不是针对最坏情况。但是,假设您有一个相当平衡的树,log n 应该仍然适用。

    【讨论】:

    • 对于 -1 :请解释我的回答有什么问题以及原因
    猜你喜欢
    • 2013-09-21
    • 2014-09-05
    • 2015-02-27
    • 2016-12-15
    • 2011-07-10
    • 2020-08-14
    • 2019-03-25
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多