遍历二叉树迭代或递归 - 复杂性分析

时间:2014-03-26 18:15:12

标签: java algorithm binary-tree binary-search-tree time-complexity

我听到一些意见认为二进制搜索树中的迭代查找比递归方式更有效,是真的吗?
(我知道在空间方面,这种反悔更加昂贵)

4 个答案:

答案 0 :(得分:1)

就时间复杂度(Big O)而言,如果您的算法正确实施,应该没有任何区别。递归通常比空间更重,因为每个递归调用在堆栈上分配新空间。我说的是你的特定二叉搜索树结构,但这通常也是正确的。

答案 1 :(得分:1)

递归搜索和迭代搜索之间确实没有区别,因为你无论如何遍历树的高度检查左边节点或右边节点,但从不同时(两者都是迭代和递归)从而你总是穿过树的高度。

答案 2 :(得分:1)

理论上没有变化。 bigO将是O(n)用于不平衡,O(logn)用于平衡BST。 递归遍历在纸上看起来很干净。但它有很多开销。当递归调用函数时,调用函数的状态必须存储在堆栈中,控件将传递给被调用函数。但是当你迭代地执行它时,你没有这样的开销。因此,出于实际目的,您应该使用迭代方法。

如果编写递归代码并且结果是尾递归,那么大多数现代编译器都会尝试通过将其转换为迭代代码来优化它。

答案 3 :(得分:0)

很大程度上取决于您的语言实施!如果过程调用在您的语言中很昂贵,那么手写迭代可能会更快。如果过程调用总是推送堆栈,那么手写迭代可以节省内存。在一个函数式语言,如Scheme,Haskell,ML等(我认为也是基于堆栈的语言,如Postscript或FORTH),你通常可以期望在树查找操作中找到的“尾递归”转换为迭代在引擎盖下,所以没有区别。事实上,这种特殊形式的尾递归(函数返回对本身的调用的值)可能会被甚至不支持完全尾调用优化(TCO)的编译器优化。