#recursion #tree #traversal #tree-traversal
#рекурсия #дерево #обход #обход дерева
Вопрос:
Я пытался сохранить свой предварительный обход в векторе. Сначала я попробовал это.
vector<int> s;
vector <int> preorder(Node* root)
{
if(root==NULL)
return s;
s.push_back(root->data);
preorder(root->left);
preorder(root->right);
return s;
}
И это дало мне неправильный ответ, но позже, когда я попробовал это
void pre(Node* root,vector<int>amp; s)
{
if(root==NULL)
return;
s.push_back(root->data);
pre(root->left,s);
pre(root->right,s);
}
vector <int> preorder(Node* root)
{
vector<int> s;
pre(root,s);
return s;
}
Я получил правильный ответ.Я не понимаю, почему мой первый код выдавал мне WA.
(Как я могу сделать это в одной функции?)
Комментарии:
1. Очищаете ли вы свой вектор
s
после каждого вызова функции в первом коде? Кажется, вы вызываете несколько раз, ноs
никогда не очищаетесь.2. Зачем мне нужно его очищать, я имею в виду, что функция push_back для каждого узла будет выполняться один раз, зачем мне нужно очищать мой вектор? @Suparshva
3. Под несколькими вызовами я имел в виду не в смысле рекурсии. Похоже, вы выполняете несколько предварительных вызовов вне функции с другим
root
аргументом. Также я предполагаюs
, что он является глобальным.4. Ya s является глобальным. В первом коде у меня была только основная функция, кроме этой. ссылка на ques:practice.geeksforgeeks.org/problems/preorder-traversal/1
5. Тогда, похоже, вы не контролируете код драйвера для своей функции. Код драйвера может вызывать вашу функцию несколько раз.