c++ - 二叉搜索树前序遍历,递归与循环?

标签 c++ algorithm

我们可以像这样通过递归遍历二叉搜索树:

void traverse1(node t) {
    if( t != NULL) {
        visit(t);
        traverse1(t->left);
        traverse1(t->right);
    }
}

还有通过循环(带堆栈),如:

void traverse2(node root) {
    stack.push(root);
    while (stack.notEmpty()) {
        node next = stack.pop();
        visit(next);
        if (next->right != NULL)
            stack.push(next->right);
        if (next->left != NUll)
            stack.push(next->left)
    }
}

问题

哪个效率更高?为什么?

我认为这两种方法的时间复杂度都是O(n)。所以所有的差异都在空间复杂度或..?

最佳答案

这将取决于您如何定义效率?它是在运行时、代码量、可执行文件的大小、使用了多少内存/堆栈空间,或者理解代码的难易程度?

递归非常容易编写代码,希望易于理解,并且代码更少。循环可能有点复杂(取决于你如何看待复杂性)和代码。递归可能更容易理解,并且代码量和可执行文件大小会更少。假设你有几个项目要横向,递归将使用更多的堆栈空间。

循环将有更多的代码(如上面的示例所示),并且可能被认为更复杂一些。但是横向只是一次调用,而不是多次调用。因此,如果您有很多项目要横向处理,循环会更快,因为您没有时间将项目压入堆栈并将它们弹出,而这正是使用递归时会发生的情况。

关于c++ - 二叉搜索树前序遍历,递归与循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333078/

相关文章:

c++ - 匿名 typedef struct C++ 的前向声明

C++:在基对象列表中,派生内存在通过引用传递时会产生意想不到的结果

c++ - 没有这样的插槽 QLineEdit::setText

algorithm - 算法的复杂度(渐近)

algorithm - 找到具有足够平均分数的最长序列

c++ - 矩形边界内的旋转线

c++ - 如何将文件夹与另一个目录中的一些 .cpp 和 .h 文件链接为虚幻引擎项目的包含路径?

c++ - 如何将单个 32 位浮点加载到 AVX ymm 寄存器中的所有八个位置?

java - 制作一个简单的视频 - 未压缩,逐帧

algorithm - 优化问题的特征意味着什么?