Файл: Отчет по лабораторной работе 1 по дисциплине Структуры и алгоритмы обработки данных в эвм.docx

ВУЗ: Не указан

Категория: Отчет по практике

Дисциплина: Не указана

Добавлен: 30.11.2023

Просмотров: 85

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МинистерствообразованияинаукиРоссийскойФедерацииФедеральноегосударственноебюджетноеобразовательноеучреждениевысшегопрофессиональногообразованияТОМСКИЙГОСУДАРСТВЕННЫЙУНИВЕРСИТЕТСИСТЕМУПРАВЛЕНИЯИРАДИОЭЛЕКТРОНИКИ(ТУСУР)Кафедраавтоматизированныхсистемуправления(АСУ)Отчетполабораторнойработе1подисциплине«СтруктурыиалгоритмыобработкиданныхвЭВМ»Выполнил: Небиев Н.И. « 26 » июля 2023 г.Проверил: «»20г.СОДЕРЖАНИЕ

  1. Тема работы.

  2. Цель работы.

  3. Индивидуальное задание.

  4. Результаты работы программы.

  5. Выводы.
ПриложениеА.Листингпрограммы.

  1. Тема работы.
«Бинарныедеревья».

  1. Цель работы.
ПолучитьпрактическиенавыкипредставлениявпамятиЭВМструктурыданных«бинарноедерево»,реализоватьнаязыкепрограммированияC/C++алгоритмыработысдеревьями.

  1. Индивидуальное задание.
Дана последовательность чисел. Написать программу формированияи вывода бинарного дерева на экран. Найти в построенном бинарном дереве все вершины, для которых выполняется условие: количество потомковв левом поддереве отличается от количества потомков в правом поддеревена 1. После выполнения программы очистить память, занятую древовидной структурой

  1. Результаты работы программы.

  1. Выводы.

ВрезультатевыполнениялабораторнойработыполученыпрактическиенавыкипредставлениявпамятиЭВМструктурыданных«бинарноедерево»,реализованынаязыкепрограммированияC/C++алгоритмыработысдеревьями.Приложение А#include

using namespace std;

struct node

{

int value; //значение вершины

node *L, *R; //Левая и Правая часть дерева

};

void add(node **n, int aData)

{

if (*n == NULL)

{

*n = new node; //Выделяем память, создаем новую ветку

(*n)->value = aData; //Кладем в выделенное место аргумент

(*n)->L = NULL;

(*n)->R = NULL; //Очищаем память для следующего роста

return;

}

if (aData > (*n)->value )

{

add( &(*n)->R, aData );

}

if (aData <= (*n)->value)

{

add( &(*n)->L, aData);

}

};

int TreeCalc(node **n, int allChild) {

int ChLeft, ChRigth;

if (*n == NULL) //дойдя до дна(низа древа).

{

return allChild = 0;//потомков нет.

}

else //Если узел существует.

//Подсчёт количества потомков для текущего узла.

ChLeft = TreeCalc( &(*n)->L, allChild); //Для левой ветви.

ChRigth = TreeCalc( &(*n)->R, allChild); //Для правой ветви.

if ( (ChLeft-ChRigth==1 )||(ChRigth-ChLeft == 1) )

{

cout<<"("<< (**n).value<<"): Потомков слева = "<< ChLeft<<" потомков справа = "<< ChRigth<
}

//потомки текущей вершины = 1 + потомки слева + потомки справа

return allChild = 1 + ChLeft + ChRigth;

};

void freeMem(node **n)

{

if (*n == NULL) {

return;

}

freeMem(&(*n)->L);

freeMem(&(*n)->R);

free(*n);

*n = NULL;

};

int main()

{

setlocale(LC_ALL, "rus");

node *tree = NULL; //Создаем пустое дерево

cout << "hello" << endl;

int s; //Число, передаваемое в дерево

cout << "Для окончание ввода введите любой символ" << endl;

do

{

cout << "ведите число ";

cin >> s; //Считываем элемент за элементом

if (cin) {

add(&tree, s);

}

else {

cout<<"ввод окончен"<
}

} while (cin);

cout << "бинарное дерево построенно" << endl;

TreeCalc(&tree, 0);

//сюда добавить вывод сообщение если условие не выполнялось

freeMem(&tree);

system("pause");

return 0;

}