我有一个关于二元排序树设计原则的问题。
我需要创建二进制表达式树的深层副本,并且我通过遍历树中的所有节点并创建一个新的,相同的节点来完成此任务。
我已经为其他用途设置了一个treeIterator,并且想知道迭代器是否会更快,更慢,或者与递归执行它的速度/内存使用速度相同。
谢谢!
答案 0 :(得分:2)
我认为递归会更快。
我不知道你的迭代器的确切实现,但我认为它会进入每个节点?如果您的BST基于根节点结构,那么转到每个节点(如在迭代器中)将比递归慢。
以下是我将如何实现它:
递归, 创建新的根节点(与原始根节点相同)。 添加原始根的左侧和右侧节点的副本。 (如果存在的话)
答案 1 :(得分:0)
您没有指定如何实现迭代器。迭代器只是一个接口,而不是特定的实现。
在BST中搜索需要 O(log n)时间,这意味着在任何时间点,找到下一个节点应该花费O(log n)时间。
说明: 下一个节点始终是右子树中的最小元素或当前节点的父节点。在任何情况下,它都不会超过 log n 时间。
除非你的迭代器实现时间少于 O(log n),否则递归会更快。
编辑:我需要指出这里的O符号是针对普通情况的,而不是最坏的情况。但是,假设您有一个相当平衡的树, log n 仍然应用。
答案 2 :(得分:0)
有两个部分:(1)走树;(2)创建新的树拷贝。我假设迭代你的意思是一个循环,手动维护树中的位置。这可能比递归更快/更少内存。但是,在构建新树时,最好使用递归并在行走时构建树。如果您迭代并将节点插入到将采用O(n lg n)的新树中。另一方面,递归只需要O(n),尽管你可能会在非常深的树上炸掉你的堆栈。