#c #vector #binary-search-tree #nodes
#c #вектор #двоичное дерево поиска #узлы
Вопрос:
Я пытаюсь пересечь шаблонное дерево AVL с парой ключевых значений и вернуть вектор всех значений.
При использовании оператора cout я могу сказать, что функция правильно пересекает дерево и возвращает все значения в дереве. Однако, когда я пытаюсь добавить это в вектор и использовать его в другой части моей программы, сохраняется только корневой узел.
vectorlt;sgt; treeTraversal(){ return treeTraversal(root); } vectorlt;sgt; treeTraversal(AVLNodelt;t, sgt; *node ){ vectorlt;sgt; temp; if(node != nullptr){ treeTraversal(node -gt; left); treeTraversal(node -gt; right); temp.push_back(node -gt; vectorToBe); } return temp; }
Я намерен сохранить все возвращенные значения в векторе, чтобы получить к ним доступ в более поздней части моей программы
Комментарии:
1. Видите ли вы вызовы, в
treeTraversal
которых возвращаемое значение полностью игнорируется? Сделайте функцию[[nodiscard]]
, и вам сообщат о ваших ошибках.
Ответ №1:
treeTraversal(node -gt; left);
Это рекурсивно вызывает функцию, это один из двух рекурсивных вызовов. Ваша treeTraversal()
функция возвращает вектор. Однако здесь его возвращаемые значения отбрасываются и нигде не хранятся.
return temp;
Это вектор, который определяет ваша функция return
. Однако, как мы видели, он не включает ничего, что было возвращено в результате каких-либо рекурсивных вызовов, потому что эти возвращенные значения отбрасываются и игнорируются.
Есть два обычных способа исправить это:
- Не игнорируйте возвращаемый вектор из обоих рекурсивных вызовов. Сохраните их, а затем добавьте их содержимое
temp
. - Вместо того, чтобы возвращать
std::vector
, сделайте его дополнительным параметром рекурсивного вызова. Каждый рекурсивный вызов просто добавляет свое значение к переданному вектору (и перенаправляет его на любые последующие рекурсивные вызовы). Вызывающий вашу рекурсивную функцию будет отвечать за создание экземпляра изначально пустого вектора и его передачу.
Комментарии:
1. Я только что заметил, что мое решение явно упомянуто в вашей пуле № 2. :/ Моя вина.
Ответ №2:
Я бы попробовал что-нибудь в этом роде. Вы избежите создания тонны vectorlt;sgt;
s в стеке.
vectorlt;sgt; treeTraversal(){ vectorlt;sgt; result; treeTraversal(root, result); return result; } void treeTraversal(AVLNodelt;t, sgt; *node, vectorlt;sgt;amp; visited ){ if(node != nullptr){ treeTraversal(node -gt; left, visited); treeTraversal(node -gt; right, visited); visited.push_back(node-gt;vectorToBe); } }