递归Vs迭代遍历BST

时间:2016-08-09 14:04:36

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

如果我对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哪一个更好&amp;如何吗

1 个答案:

答案 0 :(得分:2)

如果您关心内存使用,则应尝试确保树 平衡 ,即其深度小于节点数。具有N个节点的完美平衡二叉树具有深度log 2 N(向上舍入)。

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