Вы находитесь на странице: 1из 9

#include <iostream>

#include <cstdlib> // для функции exit()

using namespace std;

// структура для узла дерева

struct BusStop {

int stopNumber;

string stopName;

BusStop* left; // указатель на левого потомка

BusStop* right; // указатель на правого потомка

};

// функция для создания нового узла дерева

BusStop* createNewNode(int stopNumber, string stopName) {

BusStop* newNode = new BusStop;

newNode->stopNumber = stopNumber;

newNode->stopName = stopName;

newNode->left = nullptr;

newNode->right = nullptr;

return newNode;

// функция для ввода информации о новом узле с клавиатуры

BusStop* inputNewNode() {

int stopNumber;

string stopName;

cout << "Введите номер остановки: ";

cin >> stopNumber;

cout << "Введите название остановки: ";

cin.ignore(); // игнорируем символ перевода строки

getline(cin, stopName);
return createNewNode(stopNumber, stopName);

// функция для добавления нового узла в дерево

void addNode(BusStop*& root) {

BusStop* newNode = inputNewNode();

if (root == nullptr) {

root = newNode; // если дерево пустое, новый узел становится корнем

cout << "Новый узел успешно добавлен как корень дерева" << endl;

else {

BusStop* current = root;

bool added = false;

while (!added) {

if (newNode->stopNumber < current->stopNumber) {

if (current->left == nullptr) {

current->left = newNode;

cout << "Новый узел успешно добавлен как левый потомок" << endl;

added = true;

else {

current = current->left;

else if (newNode->stopNumber > current->stopNumber) {

if (current->right == nullptr) {

current->right = newNode;

cout << "Новый узел успешно добавлен как правый потомок" << endl;

added = true;

else {

current = current->right;
}

else { // если номер остановки уже существует в дереве

cout << "Ошибка: узел с номером " << newNode->stopNumber << " уже существует в
дереве" << endl;

delete newNode; // удаляем новый узел, чтобы не было утечек памяти

added = true;

// функция для вывода информации об узле

void printNode(BusStop* node) {

cout << node->stopNumber << " ";

// функция для обхода дерева прямым способом и вывода информации об узлах

void preOrderTraversal(BusStop* root) {

if (root != nullptr) {

printNode(root);

preOrderTraversal(root->left);

preOrderTraversal(root->right);

// функция для обхода дерева обратным способом и вывода информации об узлах

void postOrderTraversal(BusStop* root) {

if (root != nullptr) {

postOrderTraversal(root->left);

postOrderTraversal(root->right);

printNode(root);
}

// функция для обхода дерева симметричным способом и вывода информации об узлах

void inOrderTraversal(BusStop* root) {

if (root != nullptr) {

inOrderTraversal(root->left);

printNode(root);

inOrderTraversal(root->right);

// функция для вывода дерева

void printTree(BusStop* root) {

if (root != nullptr) {

printTree(root->left);

printNode(root);

printTree(root->right);

// информации об узлах

// функция для определения количества узлов дерева

int countNodes(BusStop* root) {

if (root == nullptr) {

return 0;

else {

return countNodes(root->left) + 1 + countNodes(root->right);

BusStop* searchNode(BusStop* root, int stopNumber) {

if (root == nullptr) {
return nullptr;

if (root->stopNumber == stopNumber) {

return root;

BusStop* leftResult = searchNode(root->left, stopNumber);

if (leftResult != nullptr) {

return leftResult;

return searchNode(root->right, stopNumber);

// функция для изменения информации об узле по номеру остановки

void updateNode(BusStop* root, int stopNumber) {

BusStop* nodeToUpdate = searchNode(root, stopNumber);

if (nodeToUpdate == nullptr) {

cout << "Узел с номером " << stopNumber << " не найден" << endl;

else {

string newStopName;

cout << "Введите новое название остановки: ";

cin.ignore();

getline(cin, newStopName);

nodeToUpdate->stopName = newStopName;

cout << "Информация об узле с номером " << stopNumber << " успешно обновлена" << endl;

// функция для обмена местами двух узлов по номерам остановок

void swapNodes(BusStop*& root, int stopNumber1, int stopNumber2) {

BusStop* node1 = searchNode(root, stopNumber1);

BusStop* node2 = searchNode(root, stopNumber2);

if (node1 == nullptr || node2 == nullptr) {


cout << "Один или оба узла не найдены" << endl;

else {

// меняем местами информацию об узлах

int tempStopNumber = node1->stopNumber;

node1->stopNumber = node2->stopNumber;

node2->stopNumber = tempStopNumber;

string tempStopName = node1->stopName;

node1->stopName = node2->stopName;

node2->stopName = tempStopName;

cout << "Узлы с номерами " << stopNumber1 << " и " << stopNumber2 << " успешно поменялись
местами" << endl;

// функция для определения высоты дерева

int height(BusStop* root) {

if (root == nullptr) {

return 0;

else {

int leftHeight = height(root->left);

int rightHeight = height(root->right);

if (leftHeight > rightHeight) {

return leftHeight + 1;

else {

return rightHeight + 1;

// функция для освобождения памяти, выделенной под узлы дерева


void freeMemory(BusStop* root) {

if (root != nullptr){

freeMemory(root->left);

freeMemory(root->right);

delete root;

int main() {

BusStop* root = nullptr;

while (true) {

cout << "Выберите действие:" << endl;

cout << "1. Добавить новый узел" << endl;

cout << "2. Вывести дерево прямым способом" << endl;

cout << "3. Вывести дерево обратным способом" << endl;

cout << "4. Вывести дерево симметричным способом" << endl;

cout << "5. Искать узел" << endl;

cout << "6. Изменить информацию об узле" << endl;

cout << "7. Обменять местами два узла" << endl;

cout << "8. определить высоту дерева" << endl;

cout << "9. Выход" << endl;

int choice;

cin >> choice;

int stopNumber, stopNumberToUpdate, stopNumber1, stopNumber2;

BusStop* foundNode;

switch (choice) {

case 1:

addNode(root);

break;

case 2:

cout << "Дерево (прямой обход):" << endl;

preOrderTraversal(root);

break;
case 3:

cout << "Дерево (обратный обход):" << endl;

postOrderTraversal(root);

break;

case 4:

cout << "Дерево (симметричный обход):" << endl;

inOrderTraversal(root);

break;

case 5:

cout << "Введите номер остановки для поиска: ";

cin >> stopNumber;

foundNode = searchNode(root, stopNumber);

if (foundNode == nullptr) {

cout << "Узел с номером " << stopNumber << " не найден" << endl;

else {

cout << "Найден узел:" << endl;

printNode(foundNode);

break;

case 6:

cout << "Введите номер остановки для изменения информации: ";

cin >> stopNumberToUpdate;

updateNode(root, stopNumberToUpdate);

break;

case 7:

cout << "Введите номер первой остановки для обмена: ";

cin >> stopNumber1;

cout << "Введите номер второй остановки для обмена: ";

cin >> stopNumber2;

swapNodes(root, stopNumber1, stopNumber2);

break;
case 8:

cout << "Дерево:" << endl;

printTree(root);

cout << "Высота дерева: " << height(root) << endl; // добавляем вывод высоты

break;

case 9:

cout << "Выход из программы" << endl;

return 0;

default:

cout << "Неверный выбор. Попробуйте еще раз" << endl;

break;

cout << endl;

return 0;

Вам также может понравиться