Вот вопрос, который я пытаюсь решить: Найти -й наименьшее целое число в двоичное дерево поиска:Как я могу поддерживать состояние между рекурсии вызовов
мой алгоритм: Я сделать заказовМои обход в BST. Каждый раз, когда я посещаю узел, я уменьшаю k на 1, а когда k = 0, я должен быть в k-м наименьшем узле.
Вот моя реализация:
void FindKthSmallest(struct TreeNode* root, int k)
{
if (root == NULL) return;
if (k== 0) return;
FindKthSmallest (root->left, k);
k--;
if (k == 0)
{
cout << root->data;
return;
}
FindKthSmallest (root->right, k);
}
Однако с такой реализацией, я вижу, что состояние к не может поддерживаться между рекурсивными вызовами.
Я думаю, что состояние k необходимо поддерживать в двух сценариях: рекурсивный вызов возвращается между дочерним и родительским и рекурсивными вызовами между родителем и дочерним - вот где я боюсь. Есть ли способ поддерживать состояние в таком сценарии?
Спасибо lavin. Передача k по справочным работам! – prasha6
Почему FindKthSmallest (root-> left, k) вне условия if (k> 0)? Не должно ли оно находиться в состоянии «если», чтобы избежать ненужных рекурсивных вызовов? – prasha6
Линия «if (k == 0) return;» выше FindKthSmallest (root-> left, k) уже обеспечил k> 0 при его вызове. «If (k> 0) ...» после FindKthSmallest (root-> left, k) по-прежнему необходимо, так как k может быть изменено внутри вызова FindKthSmallest (root-> left, k). – lavin