【问题标题】:Recursive Vs iterative Traversal of a BSTBST 的递归与迭代遍历
【发布时间】:2016-12-15 15:13:40
【问题描述】:

如果我对 N 个节点的二叉树进行递归遍历,它将占用执行堆栈中的 N 个空间。 如果我使用迭代,我将不得不在显式堆栈中使用 N 个空格。

问题是我们是否说递归遍历也像使用迭代一样使用O(N) 空间复杂度? 我说的是在某个平台上运行遍历代码,这限制了我的内存限制。 此外,我不是在谈论直接实现迭代(可以说其中任何一种方法都可以),我在 BST 中实现 KthSmallestElement() 的算法,该算法使用某种遍历 BST。

在空间复杂度方面我应该使用迭代方法还是递归方法,以便我的代码不会因空间限制而失败?

说清楚:

这是我实现的:

int Solution::kthsmallest(TreeNode* root, int k) {
    stack<TreeNode *> S;
    while(1)
    {
        while(root)
        {
            S.push(root);
            root=root->left;
        }

        root=S.top();
        S.pop();

        k--;
        if(k==0)
            return root->val;

        root=root->right;
    }
}

这是我朋友实现的:

class Solution {
    public:
        int find(TreeNode* root, int &k) {
            if (!root) return -1;
            // We do an inorder traversal here. 
            int k1 = find(root->left, k);
            if (k == 0) return k1; // left subtree has k or more elements.
            k--; 
            if (k == 0) return root->val; // root is the kth element.
            return find(root->right, k); // answer lies in the right node.
        }

        int kthsmallest(TreeNode* root, int k) {
           return find(root, k); // Call another function to pass k by reference.
        }
};

SO 两者中哪一个更好?如何?

【问题讨论】:

  • 您的问题是什么?请明确说明,不要问可能基于意见的问题。 “空间限制”是什么意思?谁强加了这个限制?堆或栈内存有空间限制吗?

标签: recursion iteration binary-tree binary-search-tree space-complexity


【解决方案1】:

如果您关心内存使用,您应该尽量确保您的树是平衡,即它的深度小于节点数。具有 N 个节点的完美平衡二叉树的深度 log2N(向上取整)。

这很重要,因为访问二叉树中所有节点所需的内存与树的深度成正比,而不是与您错误地认为的节点数成正比;递归或迭代程序需要“记住”从根到当前节点的路径,而不是其他以前访问过的节点。

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 2011-08-31
    • 2021-05-28
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多