Nノードのバイナリツリーの再帰的トラバーサルを実行すると、実行スタックでN個のスペースを占有します。 私は反復を使用する場合、私は明示的なスタックでN個のスペースを使用する必要があります。再帰的Vs反復的BSTのトラバーサル
質問再帰的なトラバーサルは、反復的なものが使用しているようにO(N)
空間の複雑さを使用しているとも言えますか? 私はメモリ制限によって私を制限するいくつかのプラットフォームでトラバーサルコードを実行するという面で話しています。 また、反復処理を直接実装することについては言及していません(いずれかのアプローチが良いと言えるでしょう)、私は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 2のどちらがどのように&良いですか?
ご質問はありますか?それをはっきりと述べて、意見に基づいた質問はしないでください。 「スペース制限」とはどういう意味ですか?誰がこの制限を課していますか?ヒープまたはスタックメモリの領域制限はありますか? – Cristy