Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASD.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
203.55 Кб
Скачать

Лабораторна робота №4

«Дерева. Алгоритми обходу»

Завдання: зробити обхід дерева трьома варіантами.

Код программи:

#include <iostream>

#include <Windows.h>

using namespace std;

struct Node

{

Node *l, *r; //левое и правое поддерево

char x; //Некоторые данные

};

/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЗВЕНА В ДЕРЕВО*/

void add(char x, Node *&MyTree) //Функция добавления звена в дерево

{

if (NULL == MyTree) //Если дерева нет, то сеем семечко

{

MyTree = new Node; //Выделяем память под звено дерева

MyTree->x = x; //Записываем данные в звено

MyTree->l = MyTree->r = NULL; //Подзвенья инициализируем пустотой во избежание ошибок

}

if (x < MyTree->x) //Если нововведенный элемент x меньше чем элемент x из семечка дерева, уходим влево

{

if (MyTree->l != NULL) add(x, MyTree->l); //При помощи рекурсии заталкиваем элемент на свободный участок

else //Если элемент получил свой участок, то

{

MyTree->l = new Node; //Выделяем память левому подзвену. Именно подзвену, а не просто звену

MyTree->l->l = MyTree->l->r = NULL; //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой

MyTree->l->x = x; //Записываем в левое подзвено записываемый элемент

}

}

if (x > MyTree->x) //Если нововведенный элемент x больше чем элемент x из семечка дерева, уходим вправо

{

if (MyTree->r != NULL) add(x, MyTree->r); //При помощи рекурсии заталкиваем элемент на свободный участок

else //Если элемент получил свой участок, то

{

MyTree->r = new Node; //Выделяем память правому подзвену. Именно подзвену, а не просто звену

MyTree->r->l = MyTree->r->r = NULL; //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой

MyTree->r->x = x; //Записываем в правое подзвено записываемый элемент

}

}

}

/*ПРЕФИКСНЫЙ ОБХОД*/

void preorder(Node *&tree)

{

if (NULL == tree) return; //Если дерева нет, выходим

cout << tree->x << endl; //Посетили узел

preorder(tree->l); //Обошли левое поддерево

preorder(tree->r); //Обошли правое поддерево

}

/*ИНФИКСНЫЙ ОБХОД*/

void inorder(Node *&tree)

{

if (NULL == tree) return;

inorder(tree->l);

cout << tree->x << endl;

inorder(tree->r);

}

/*ПОСТФИКСНЫЙ ОБХОД*/

void postorder(Node *&tree)

{

if (NULL == tree) return;

postorder(tree->l);

postorder(tree->r);

cout << tree->x << endl;

}

void main()

{

setlocale(LC_ALL, "rus");

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

cout << "***************************MENU*****************************\n----------------Created by Zadneprovskyi Vlad---------------\nATTENTION!!! This programm works with the Tree\n------------------------------------------------------------\nEnter the string: ";

char S[256];

Node *MyTree = NULL;

cin.getline(S, 255);

int k = strlen(S);

for (int i = 0; i<k; i++)

{

if (S[i] != '.')

{

if (S[i] != '*')

{

add(S[i], MyTree);

}

else

{

S[i] = NULL;

}

}

else

{

break;

}

}

cout << endl << "ПРЕФИКСНЫЙ ОБХОД" << endl;

preorder(MyTree);

cout << endl << "ИНФИКСНЫЙ ОБХОД" << endl;

inorder(MyTree);

cout << endl << "ПОСТФИКСНЫЙ ОБХОД" << endl;

postorder(MyTree);

system("pause");

}

Вивід:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]