Обход двоичного дерева с использованием векторного возвращаемого типа

#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 . Однако, как мы видели, он не включает ничего, что было возвращено в результате каких-либо рекурсивных вызовов, потому что эти возвращенные значения отбрасываются и игнорируются.

Есть два обычных способа исправить это:

  1. Не игнорируйте возвращаемый вектор из обоих рекурсивных вызовов. Сохраните их, а затем добавьте их содержимое temp .
  2. Вместо того, чтобы возвращать 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);  } }