- •Журнал лабороторних робіт з дисципліни: Алгоритми і структури данних
- •Лабораторна робота №1
- •Питання до захисту :
- •Лабораторна робота №2 «Робота з чергою та стеком»
- •Лабораторна робота №3 «Розробка програми створення зв'язаного списку»
- •Лабораторна робота №4
- •Питання до захисту :
- •Лабораторна робота №5 «Побудова рекурсивних функцій»
- •Питання до захисту :
- •Лабораторна робота №6 «Бінарне дерево пошуку»
- •Питання до захисту :
- •Лабораторна робота №7 «Реалізація алгоритмів обмінних сортувань»
Лабораторна робота №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");
}
Вивід:
