【发布时间】: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