Построение бинарного дерева

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    988,08 Кб
  • Опубликовано:
    2014-07-27
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Построение бинарного дерева

Введение

древо бинарный программный

Объектом разработки в курсовой работе является структура данных - бинарное дерево поиска.

Целью работы является изучение данной структуры, а затем разработка приложения на языке программирования C# с её реализацией в виде класса.

В ходе курсовой работы была разработана справочна-информационная система на языке программирования C#, описывающая структуру бинарного дерева поиска и позволяющий выполнять с ним основные операции (добавление, удаление, поиск и так далее).

В пояснительной записке разобраны основные понятия, связанные с бинарными деревьями. Также описана работа с интерфейсом пользователя. В подразделах «Описание разработанного программного продукта» приведены структура и компоненты программных средств.

Организация данных с помощью бинарных деревьев поиска позволяет значительно сократить время поиска нужного элемента. Поиск элемента в линейных структурах данных обычно осуществляется путем последовательного перебора всех элементов, присутствующих в данной структуре. Поиск по дереву не требует перебора всех элементов, поэтому занимает значительно меньше времени.

В данном курсовом проекте главной целью является разработка справочно-информационной системы на языке программирования C#, который предоставляет способ организации данных в виде «Бинарного дерева». Более того в программу должен быть заложен принцип, удобства, простоты и качества, что подразумевает отсутствие у пользователя перечня определённых навыков, за исключением простейшей компьютерной этики.

Разрабатываемый программный продукт отлично подойдёт для организаций, которые в своей профессиональной среде сталкиваются с большим количеством информации.

Исходя из задач, актуальностью создаваемой программы является сокращение времени работы, рациональное распределение времени, что позволяет выполнить большой объём работы за более короткие сроки.

1. Бинарное дерево

1.1 Древовидная структура - «Бинарное дерево поиска»

Бинарное (двоичное) дерево - это упорядоченное дерево, каждая вершина которого имеет не более двух поддеревьев, причем для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла[1].

Бинарное дерево является рекурсивной структурой, поскольку каждое его поддерево само является бинарным деревом и, следовательно, каждый его узел в свою очередь является корнем дерева.

Узел дерева, не имеющий потомков, называется листом.

Пример бинарного дерева представлен на рисунке 1.1.

Рисунок 1.1 - Схематичное изображение бинарного дерева

Глубина бинарного дерева - это максимальный уровень листа дерева, иначе говоря, длина самого длинного пути от корня к листу дерева[2].

Возможны случаи, когда бинарное дерево может представлять собой пустое множество или бинарное дерево может выродиться в список (рисунок 1.2), в данном случае такое дерево будет называться вырожденным.


Рисунок 1.2 - Вырожденное бинарное дерево

Бинарное дерево будет представлять собой пустое множество, только в случаях отсутствия корня.

1.2 Терминология

Терминология, применяемая для описания бинарных деревьев[3]:

)        узел - это точка, где может возникнуть ветвь;

)        корень - «верхний» узел дерева;

)        ветвь - отрезок, описывающий связь между двумя узлами;

)        лист - узел, из которого не выходят ветви, т.е. не имеющий поддеревьев;

)        родительским - называется узел, который находится непосредственно над другим узлом;

)        дочерним - называется узел, который находится непосредственно под другим узлом;

)        предки данного узла - это все узлы на пути вверх от данного узла до корня;

)        потомки - все узлы, расположенные ниже данного;

)        внутренний узел - узел, не являющийся листом;

)        порядок узла - количество его дочерних узлов;

)        глубина узла - количество его предков плюс единица;

)        глубина (высота) дерева - максимальная глубина всех узлов;

)        длина пути к узлу - количество ветвей, которые нужно пройти, чтобы дойди от корня к данному узлу;

)        длина пути дерева (длина внутреннего пути) - сумма длин путей всех его узлов.

1.3 Обход бинарного дерева в глубину

Существуют три порядка, использующие обход в глубину[4]:

)        Сверху вниз (PreOrder):

а) обработать корень;

б) обход левого поддерева;

в) обход правого поддерева;

)        Слева направо (InOrder):

а) обход левого поддерева;

б) обработать корень;

в) обход правого поддерева;

)        Снизу вверх (PosOrder):

а) обход левого поддерева;

б) обход правого поддерева;

в) обработать корень.

2. Описание задачи и исходных данных

2.1 Постановка задачи

В курсовом проекте поставленной задачей является разработать справочно-информационную (Windows-приложение) систему на языке программирования C# выполняющее следующие функции:

)        чтение из текстового файла информации об объектах класса согласно варианту (таблица 2.1). Количество записей не менее 50. Предусмотреть наличие в файле не корректных записей, которые в процессе работы программы не будут обрабатываться. Использовать регулярные выражения (предусмотреть проверку по возможности всех полей);

)        вывод исходных данных в виде таблицы;

)        визуализация хеш-таблицы или бинарного дерева;

)        поиск информации по заданному ключу или способу обхода;

)        редактирование исходных данных (вставка, удаление, замена) с внесением соответствующих изменений в хеш-таблицу или бинарное дерево поиска. Использовать регулярные выражения;

)        вывод справочной информации о программном продукте и об авторе;

)        демонстрация перегруженных операторов;

)        поиск максимального объекта.

2.2 Описание исходных данных

Исходными данными задачи являются:

)        название предметной области, а точнее название класса и его основные поля указаны в таблице 2.1, которое выбирается согласно варианту выданному преподавателем;

)        текстовый файл с информацией об объектах класса согласно варианту. Количество записей не менее 50. Предусмотреть наличие в файле не корректных записей, которые в процессе работы программы не будут обрабатываться;

)        бинарное дерево поиска, ключ и способ обхода дерева указан в таблице 2.2.

Таблица 2.1 - Описание класса

№ варианта

Название класса

Поля

16

Записная книжка

Ф.И.О. контактного лица, мероприятие, дата и время мероприятия


Таблица 2.2 - Способ обхода бинарного дерева

№ варианта

Ключ

Способ обхода бинарного дерева

Обход производить с помощью

16

Ф.И.О.

Обход в глубину - снизу вверх (префиксный обход)

Стека


На основе указанных исходных данных требуется выполнить следующее:

)        создать класс согласно варианту. Класс должен содержать следующие элементы:

а)      описание полей класса (выделенное жирным курсивов поле оформить как перечисление);

б)      конструкторы с параметрами и по умолчанию, а также необходимые свойства и методы;

в)      перегрузку одного из бинарных операторов (указать точно какой выбран самостоятельно бинарный оператор и что реализует);

г)       перегрузку одного из операторов отношения (указать точно какой выбран самостоятельно оператор отношения и что реализует);

д)      перегрузку префиксного и постфиксного инкремента (указать назначение инкремента);

е)       перегрузку операторов << и >> (указать назначение операторов);

ж)      создание массива из объектов вашего класса;

з)       функцию, определяющую максимальный объект (указать по какому признаку выбирается максимальный объект). Для сравнения использовать перегруженный оператор отношения;

и)      предусмотреть обработку и инициализацию исключительных ситуаций;

к)      Класс должен реализовывать интерфейс IComparable;

)        разработать интерфейс Windows-приложения автоматизированной системы. Помимо самостоятельно выбранных элементов управления, обязательно могут присутствовать следующие элементы управления: MenuStrip, ContextMenuStrip, Button, TextBox, DataGridView, TextBox, ToolTIp, Panel, Label, ComboBox, OpenFileDialog, SaveFileDialog, PictureBox, CheckBox, RedioButton.

2.3 Анализ поставленной задачи

Обход в глубину производится рекурсивно либо с использованием стека. В обоих случаях можно обходить узлы дерева в различной последовательности[4]. Обход начинается от корня. Выделяют три наиболее важных порядка обхода в глубину:

)        префиксный (прямой) обход - сначала обрабатывается текущий узел, затем левое и правое поддеревья;

)        инфиксный (симметричный) обход - сначала обрабатывается левое поддерево текущего узла, затем корень, затем правое поддерево;

)        постфиксный (обратный) обход - сначала обрабатываются левое и правое поддеревья текущего узла, затем сам узел.

Рисунок 1.2 - Бинарное дерево поиска

Исходя из рисунка 1.2 можно сделать следующие выводы:

)        префиксный обход: A, B, D, H, E, C, F, I, J, G;

2)      инфиксный обход: D, H, B, E, A, I, F, J, C, G;

3)      постфиксный обход: H, D, E, B, I, J, F, G, C, A.

Основным из достоинств постфиксного обхода является - нахождение минимального элемента в бинарном дереве[5]. Так как первым условием данного обхода является: «Обход левого поддерева», а по условию организации бинарного дерева - самый левый элемент является минимальным.

Также к достоинству данного метода можно отнести быструю скорость нахождения элемента, так как будет происходит сравнивание текущего элемента (в бинарном дереве) с элементом который требуется найти и уже по свойствам организации бинарных деревьев следует «дойти» до необходимого элемента[7].

3. Описание разработанного Программного продукта

3.1 Описание программных модулей

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

Класс «Node» - узел бинарного дерева, содержит в себе следующие методы:

)        «Add» - метод добавления узла в дерево поиска;

)        «Quest» - метод поиска элемента в бинарном дереве, способом обхода «В глубину - снизу вверх (префиксный обход)», по заданному ключу (введённым пользователем в отдельном окне);

)        «Sub» - метод для осуществления замены элементов в дереве;

)        «Removal» - метод удаления элемента из бинарного дерева (описаны все 3 случая удаления элемента из дерева);

)        «Top» - метод, осуществляющий поиск максимального элемента в дереве по средством операторов отношения и алгоритма организации бинарного дерева;

)        «Scan» - метод, осуществляющий сам «Обход» бинарного дерева способом «В глубину - снизу вверх (префиксный обход)»;

)        «Loading» - метод загрузки бинарного дерева в компоненты «DataGridView» и «TreeView»;

)        «Preservation» - метод сохранения (выгрузки) бинарного дерева в файл, по указанному пути пользователем.

Каждому из перечисленных методов выше (кроме «Scan» и «Loading») соответствует свой пункт в меню («MenuStrip»):

)        пункт меню «Вставка» - вызывает метод «Add»;

)        «Поиск - Поиск элемента» - осуществляется выполнение метода «Quest»;

)        «Поиск - Поиск максимального элемента» - происходит выполнение метода «Top»;

)        «Изменение» - вызов метода «Sub»;

)        «Удаление» - осуществление метода «Removal».

Класс «Notebook» - записная книжка (описанная предметная область с её полями и названием класс), включает в себя основные методы:

)        «CompareTo» - переопределение метода интерфейса «IComparable», который сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект;

)        «Compare_Enum» - проверка наличия вида мероприятия в перечислении.

3.2 Описание работы методов

Метод «Add» - вызывается при нажатии пунктов меню «Файл - Открыть» и «Работа с данными - Вставка». Сам алгоритм работы данного метода представлен на рисунке 3.1.

Рисунок 3.1 - Блок схема метода «Add»

Метод «Scan» - осуществляет сам обход бинарного дерева (является практически основным методом программы). Данный метод не вызывается посредством меню, а выполняет роль второстепенного метода (подпрограммы) для остальных методов (таких как: «Quest», «Sub», «Removal»).

Алгоритм обхода (метод «Scan») представлен на рисунке 3.2.

Рисунок 3.2 - Блок схема метода «Scan»

Метод «Sub» - метод для осуществления замены элементов в дереве. Сам алгоритм заключается в следующем:

)        произвести поиск элемента с помощью обхода (метода «Scan»);

)        заменить найденных элемент на новый элемент файле;

)        произвести перестройку дерева с помощью метода «Add», алгоритм которого представлен на рисунке 3.1.

Более подробно алгоритм работы метода «Sub» представлен на рисунке 3.3.

Рисунок 3.3 - Блок схема метода «Sub»

Метод «Top» - осуществляет поиск максимального элемента в дереве по средством операторов отношения. Алгоритм работы представлен на рисунке 3.4.

Рисунок 3.4 - Блок схема метода «Top»

Метод «Removal» - удаляет элемент из бинарного дерева. Удаление элемента в бинарном дереве включает в себя 3 случая[8]:

)        удаляемый элемент не имеет сыновей, в данном случае такой элемент называется листом и заменяется просто на пустое значение.

)        удаляемый элемент имеет либо левого сына, либо правого, в этом случае достаточно поменять удаляемый элемент на его сына, удалить ссылку на сына и очистить память.

)        удаляемый элемент имеет и левого и правого сына. В данной ситуации требуется найти максимальный элемент из левого поддерева удаляемого элемента (либо минимальный элемент из правого поддерева удаляемого элемента) и переместить его на место удаляемого узла.

Алгоритм работы метода «Removal» более подробно можно увидеть на рисунке 3.5, с выполнением всех ситуаций удаления элемента из бинарного дерева.

Рисунок 3.5 - Блок схема метода «Removal»

Метод «Quest» - метод поиска элемента в бинарном дереве, способом обхода «В глубину - сверху вниз (префиксный обход)», по заданному ключу. При использовании данному метода автоматически происходит запуск метода «Scan» - Обход (рисунок 3.2), в которой происходит поиск данному элемента и возвращает его обратно в «Quest» где происходят второстепенные действия (выделение найденного элемента в таблицу и дереве). Блок схема метода «Quest» представлена на рисунке 3.7.

Рисунок 3.7 - Блок схема метода «Quest»

Оставшиеся методы «Loading» и «Preservation» - аналогичны методу «Scan», то есть такой же алгоритм, но вместо «Процессов» выполняемых после удовлетворения «Решения» происходит «Загрузка» (метод «Loading») бинарного дерева в соответствующие компоненты справочно- информационной системы или «Выгрузка» (метод «Preservation») бинарного дерева в файл.

3.3 Структура программного продукта

Программа состоит из двух классов:

)        класс «Node» - узел бинарного дерева, элемента класса отображены в таблице 3.1;

)        класс «Notebook» - записная книжка (предметная область), элементы описаны в таблице 3.2.

Таблица 3.1 - Элементы класса «Node»

Имя

Вид элемента

Тип

Спецификатор

Описание

Value

Поле

T:IComparable

Public

Содержимое узла бинарного дерева

Left

Поле

Node<T>

Private

Ссылка на левого сына

Right

Поле

Node<T>

Private

Ссылка на правого сына

Parent

Поле

Node<T>

Private

Ссылка на отца

Node (T Value)

Конструктор

-

public

Инициализация поля «Value»

Add (T Value)

Метод

Void

Public

Добавление узла в бинарное дерево

Quest (string Search)

Метод

Void

Public

Поиск элемента в бинарном дереве

Sub (string Search, string New)

Метод

Void

Public

Замена элемента в бинарном дереве

Removal (string Search)

Метод

Void

Public

Удаление элемента из бинарного дерева

Top (Node<T> Data)

Метод

Node<T>

Public

Поиск макс. элемента в дереве

Loading (TreeView Tree, DataGridView Table)

Метод

Void

Public

Загрузка бинарного дерева в «Таблицу» и «Дерево»

Preservation (string Path)

Метод

Void

Public

Сохранение бинарного дерева в файл

Scan (string Search)

Метод

Node<T>

Public

Обход бинарного дерева


Таблица 3.2 - Элементы класса «Notebook»

Имя

Вид элемента

Тип

Спецификатор

Описание

FIO

Поле

string

Private

Ф.И.О.

date

Поле

string

Private

Дата

view

Перечисление

Enum

Private

Вид мероприятия

Notebook ( string FIO, string date, string view)

Конструктор

-

Public

Инициализация полей: FIO, date, view



4. Описание интерфейса

Интерфейс - совокупность возможностей, способов и методов взаимодействия двух систем (любых, а не обязательно являющиеся вычислительными или информационными), устройств или программ для обмена информацией между ними, определённая их характеристиками, характеристиками соединения, сигналов обмена и т.п. В случае, если одна из взаимодействующих систем - человек, чаще говорят лишь о второй системе, то есть об интерфейсе той системы, с которой человек взаимодействует[10].

Первый запуск программы вызывает следующее окно, в котором доступны лишь 2 пункта меню (и 3 пункта подменю), данное окно изображено на рисунке 4.1.

Рисунок 4.1 - Интерфейс справочно-информационной системы при первом запуске

Как видно по рисунку первоначально доступны лишь пункты меню «Файл» и «О программе», и каждой пункт меню содержит свои подпункты, которые изображены на рисунке 4.2.

Рисунок 4.2 - Первоначальные подпункты меню пунктов «Файл» и «О программе»

При первом запуске, в программном продукте возможны только следующие функции:

)        «Файл - Открыть» - позволяет открыть файл *txt формата для организации бинарного дерева и осуществления с данной информацией необходимых действий (таких как поиск, удаление и т.д.);

)        «О программе - Об авторе» - открывает окно, содержащее информацию об авторе программного продукта. Данное окно изображено на рисунке 4.3;

Рисунок 4.3 - Окно появляющееся при нажатии пункта меню «О программе - Об авторе»

)        «О программе - Справка» - при нажатии данного пункта появляется окно, которое содержит информацию по работе с данной справочно-информационной системой (рисунок 4.4).

Рисунок 4.4 - «О программе - Справка»

После открытия файла (для начало работы с информацией) «Файл - Открыть» интерфейс принимает следующую новую форму (пункты меню, расширение столбов таблицы, загрузка информации в программу и т.д.). Данное окно изображено на рисунке 4.5.

Рисунок 4.5 - Интерфейс программы после открытия файла

Если при считывании файла (информации в справочно-информационную систему) были обнаружены некорректные записи, то произойдёт вызов окна, на котором изображено количество данных некорректных записей (рисунок 4.6).

Рисунок 4.6 - Окно отображающее количество некорректных записей

Рисунок 4.7 - Пункты меню после открытия файла

Становятся доступны следующие пункты меню (рисунок 4.7):

)        «Файл - Сохранить» - сохранить в текущий открытый файл всё бинарное дерево, со всеми изменениями;

)        «Файл - Сохранить как» - сохранить бинарное дерево со всеми изменениями в новый файл (указание пути сохранения файла предоставляется пользователю);

4.1 Описание функций редактирования исходных данных

3)      «Работа с данными - Вид» - позволяет изменить вид отображения информацию. Доступны 2 вида: «Таблица» (по умолчанию) и «Дерево» - визуализация информации в виде дереве (рисунок 4.8);

Рисунок 4.8 - Отображение информации в виде «Дерева»

)        «Работа с данными - Вставка» - даёт возможность пользователю добавить в бинарное дерево элемент. Как это происходит изображено на рисунке 4.9;

Рисунок 4.9 - Окно «Вставка»

)        «Работа с данными - Поиск» - позволяет произвести поиск элемента по ключу , либо найти максимальный элемент в бинарном дереве. После выполнения поиска (любым из предложенных) в «Таблице»и «Дереве» произойдёт выделение найденных элементов;

)        «Работа с данными - Изменение» - позволяет изменить уже существующие элементы в бинарном дереве на указанный (в отдельном окне) новый элемент. При нажатии данного пункта меню, произойдёт вызов нового окна «Изменение», в котором необходимо ввести «Старое значение» и «Новое значение».

)        «Работа с данными - Удаление» - даёт возможность удалить элемент из бинарного дерева.

При работе с такими пунктами меню как: «Работа с данными - Вставка», «Работа с данными - Поиск - Поиск элемента», «Работа с данными - Изменение», «Работа с данными - Удаление» предусмотрена система «Сохранение информации», то есть если в любом из окон (пунктов меню перечисленных выше) присутствует какая-либо информация, то будет сработана данная система и появится окно с запросом «В текстовом поле обнаружена информация, вы уверены что хотите выйти?» с возможностью ответа «Да» или «Нет». При нажатии на кнопку «Да» - произойдёт выход из текущего окна без сохранения информации, при нажатии на кнопку «Нет» - произойдёт возврат обратно в текущее окно.

.2 Работа с файлом

Если при работе со справочно-информационной системой (с открытым файлом) попытаться выполнить пункт «Файл - Открыть» (то есть открыть новый файл) или просто при нажатии на кнопку «Закрыть» (выход из программы), произойдёт автоматический запуск окна с запросом «Сохранить информацию?», если будет нажата кнопка «Да» - произойдёт сохранение бинарного дерева в текущий файл, кнопка «Нет» - означает закрыть программу без сохранения информации, то есть очистка текущей сессии, кнопка «Отмена» - вернуться обратно в программу без выполнения каких либо действий.

Заключение

В ходе работы были изучены теоретические сведения и закреплены знания, полученные ранее при изучении дисциплины «Конструирование программ и языки программирования». А так же были практически применены полученные знания при выполнении данной работы.

Созданная курсовая работа - отличное решение для организаций, которые в своей профессиональной среде сталкивается с большим количеством информации.

Программа была разработана на языке программирования C#, с организацией удобного пользовательского интерфейса.

В данной пояснительной записке выполнены анализ задачи, проектирование и реализация программных средств, которые являются необходимыми этапами разработки программного обеспечения.

Для реализации бинарного дерева поиска были созданы собственные классы «Node» и «Notebook». В итоге разработано приложение, предназначенное для работы с бинарным деревом поиска.

Удобный пользовательский интерфейс бинарного дерева, а так же его простота - обеспечит легкое и быстрое получение нужной информации об интересующих пользователя вопросах. При выполнении поиска запрошенной информации, разработанный программный продукт выдаст всю найденную по запросу пользователя информацию без потерь и без показа лишней информации, что позволит пользователю сократить затраты времени на поиск необходимой информации.

Для написания курсовой работы были использованы методические и учебные пособия, учебники современных и иностранных авторов, а также материалы интернет-ресурсов.

Данная курсовая работа помогает закрепить полученные знания на протяжения всего курса обучения, улучшить навыки решения поставленных задач, дает возможность научиться поиску необходимой информации для облегчения решения поставленной задачи.

Список использованных источников

1.      Бинарное дерево поиска [Электронный ресурс]. - Режим доступа: http://ru.wikipedia.org/wiki/Двоичное_дерево_поиска. - Дата доступа: 09.05.2014.

.        Бинарные деревья в пространстве имён C# [Электронный ресурс]. - Режим доступа: http://msdn.microsoft.com/enus/library/ms379572 (v=vs.80).aspx. - Дата доступа: 11.05.2014.

.        Левитин, А.В. Алгоритмы: введение в разработку и анализ. - Москва: Издательский дом Вильямс, 2006. - 65 с.

.        Ахо, А.В. Структуры данных и алгоритмы / Д.Д. Хопкрофт, Д.Д. Ульман. - Издательский дом Вильямс, 2000. - 92 с.

.        Джозеф, А. C# 5.0. Справочник. Полное описание языка. - Издательский дом Вильямс, 2013. - 1008 с.

.        Скит, Д. C#: программирование для профессионалов. - Издательский дом Вильямс, 2011. - 544 с.

7.      C Sharp [Электронный ресурс]. - Режим доступа: http://ru.wikipedia.org/wiki/C_Sharp. - Дата доступа: 20.05.2014.

.        Нейгел, К. Visual C#: полный курс. - Издательство «Диалектика», 2010. - 236 с.

.        Деревья выражений [Электронный ресурс]. - Режим доступа: http://msdn.microsoft.com/ru-ru/library/bb397951.aspx. - Дата доступа: 22.05.2014.

.        Павловская, Т.А. C#. Программирование на языке высокого уровня: учебник для вузов. - СПб.: Питер, 2007. - 432 с.

Приложение А Листинг программы

Текст программы Form1.cs

using System;System. Collections. Generic;System. ComponentModel;System. Data;System. Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows. Forms;System.IO; // ФайлыSystem. Text. RegularExpressions; // Регулярные выражения

Курсовая_работа

{partial class Form1: Form

{Form1 ()

{();

}

StreamReader Read;string Path;int k = 0;<Notebook> ekz = null; // Экземпляр дерева

class Node<T> where T: IComparable // Дерево

{T Value;Node<T> Left = null;Node<T> Right = null;Node<T> Parent = null;

Node (T Value) // Конструктор

{. Value = Value;

}

void Add (T Value) // Добавление

{

{(this. Value == null) // Если корень пуст

{. Value = Value;

}

{<T> Data = this;Stop = false;(! Stop)

{((Data. Value as Notebook).CompareTo((Value as Notebook)) == 0) // Одинаковые

{

throw new Exception («Невозможно добавить 2 одинаковых элемента в дерево»);

}((Data. Value as Notebook).CompareTo((Value as Notebook)) == 1) // Меньше Узла

{(Data. Left == null) // Если левый сын «Узла» пуст

{. Left = new Node<T>(Value); // Новый узел. Left. Parent = Data; // Отмечаем его родителя

Stop = true; // Остановиться

}

{

Data-; // Сделать текущим левого сына

}

}if ((Data. Value as Notebook).CompareTo((Value as Notebook)) == -1) // Больше

{(Data. Right == null) // Если правый сын «Узла» пуст

{. Right = new Node<T>(Value); // Новый узел. Right. Parent = Data; // Отмечаем его родителя

Stop = true; // Остановиться

}

else // Значит делаем текущим (Data) - правого сына (Data. Right)

{

Data++; // Сделать текущим правого сына

}

}

} //While(stop)

} //else (Если «Корня» нет)

}(Exception error)

{++;. Show (error. Message+»\" «+(Value as Notebook).FIO_OutPut+»\ "\nНажмите ОК чтобы продолжить», «Ошибка организации дерева», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

} //Add

static TreeNode[] Coloor = null;

void Quest (string Search, DataGridView Table, TreeView Tree) // Поиск элемента в дереве

{(Scan(Search)!= null)

{<T> Data = Scan(Search);i=0;Stop = false;(Table. Rows. Count>i)

{(Table. Rows[i].DefaultCellStyle. BackColor == Color. Green)

{. Rows[i].DefaultCellStyle. BackColor = Color. White;;

}

{++;

}

}(Coloor!= null)

{. SelectedNode = Coloor[0];. SelectedNode. BackColor = Color. White;

}=0;(Stop!=true)

{(Table [0, i].Value. ToString() == Search)

{. Rows[i].DefaultCellStyle. BackColor = Color. Green;[] Find = Tree. Nodes. Find (Search, true);= Find;. SelectedNode = Find[0];. SelectedNode. BackColor = Color. Green;= true;

}

{++;

}

}. Show («Найденный элемент выделенн зелёным цветом.\nДля снятия выделения цветом, кликните левой кнопкой мыши в любом месте строки», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);

}

{. Show («Данного контактного лица не существует», «Ошибка поиска», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

}

Node<T> Scan (string Search) // Обход (поиск)

{

{<Node<T>> Stack = new Stack<Node<T>>();<T> Data = this;Stop = false; (Data!= null) // Если корень не пустой

{. Push(Data);(Stack. Count > 0)

{= Stack. Pop();(Stop!= true)

{(Data. Left!=null && (Data. Left. Value as Notebook).CompareTo(Search) == 0)

{Data;

}if (Data. Right!= null && (Data. Right. Value as Notebook).CompareTo(Search) == 0)

{Data;

}if (Data!= null && (Data. Value as Notebook).CompareTo(Search) == 0)

{Data;

}if (Data. Left!= null && Data. Right!= null)

{. Push (Data. Right);; // Сделать текущим левого сына

}if (Data. Left!= null && Data. Right == null)

{

Data-; // Сделать текущим левого сына

}if (Data. Left == null && Data. Right!= null)

{. Push (Data. Right);= true;

}

{= true;

}

}(Stack. Count > 0)

{= false;

}

} //while (Stop)

} //if (Если корень не пуст)

else // Поиск произошёл неудачно

{

throw new Exception («Отсутствует корень дерева»);

}

}(Exception error)

{. Show (error. Message + «\nНажмите ОК чтобы продолжить», «Ошибка обхода дерева», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

return null; // Вернуть пустое значение, т.к. поиск произошёл неудачно

}

void Sub (string Search, string New) // Замена

{(Scan(Search)!= null)

{<T> Data = Scan(Search);

(Data. Value as Notebook).FIO_OutPut = New;= new StreamReader (Path, Encoding. Default);str;= Read. ReadToEnd();

//str = str. Replace (Search, New);Regular = new Regex(Search);= Regular. Replace (str, New);. Close();Write = new StreamWriter (Path, false, Encoding. Default);. Write(str);. Close();

}

{. Show («Данного контактного лица не существует», «Ошибка изменения», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

}

void Removal (string Search)

{

{(Scan(Search)!= null)

{<T> Data = Scan(Search);(Data. Left == null && Data. Right == null) // СЛУЧАЙ 1: Отсутствуют оба сына (у удаляемого элемента)

{(Data. Parent. Left!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый сын?

{. Parent. Left = null;

}if (Data. Parent. Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для (удаляемого элемента) отца мы правый сын?

{. Parent. Right = null;

}. Value = default(T);= null;

}if (Data. Left!= null && Data. Right == null) // СЛУЧАЙ 2: Есть только левый сын (у удаляемого элемента)

{<T> Stock = Data. Left; //Stock - запас. Left = null; // Удаление связи между отцом (текущим узлом) и левым сыном

if (Data. Parent!= null)

{. Parent = Data. Parent;(Data. Parent. Left!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый сын?

{. Parent. Left = Stock;

}if (Data. Parent. Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для (удаляемого элемента) отца мы правый сын?

{. Parent. Right = Stock;

}= null; // Очистка памяти

}

{. Value = Stock. Value;

}

}if (Data. Left == null && Data. Right!= null) // СЛУЧАЙ 2.1: Есть только правый сын (у удаляемого элемента)

{<T> Stock = Data. Right; //Stock - запас. Right = null; // Удаление связи между отцом (текущим узлом) и правым сыном

if (Data. Parent!= null)

{. Parent = Data. Parent;(Data. Parent. Left!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый сын?

{. Parent. Left = Stock;

}if (Data. Parent. Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для (удаляемого элемента) отца мы правый сын?

{. Parent. Right = Stock;

}= null; // Очистка памяти

}

{. Value = Stock. Value;

}

}if (Data. Left!= null && Data. Right!= null) // СЛУЧАЙ 3: Есть оба сына (у удаляемого элемента)

{<T> Data2 = Top (Data. Left); //Data2 - максимальный элемент из левого поддерева

if (Data2. Left == null && Data2. Right == null) // Если Data2 (максимальный из левого поддерева) не имеет сынов

{

if (Data. Parent!= null) // Если удаляемый элемент не корень

{(Data2. Parent. Left!= null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Left. Value) == 0) // Определяем, для отца мы левый сын?

{

Data2. Parent. Left = null;

}if (Data2. Parent. Right!= null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Right. Value) == 0) // Определяем, для отца мы правый сын?

{

Data2. Parent. Right = null;

}. Parent = Data. Parent;(Data. Parent. Left!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый сын?

{. Parent. Left. Value = Data2. Value;

}if (Data. Parent. Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для отца (удаляемого элемента) мы правый сын?

{. Parent. Right. Value = Data2. Value;

}

Data = null;

}

else // Значит удаляемый элемент - это корень

{. Value = Data2. Value;(Data2. Parent. Left!= null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Left. Value) == 0) // Определяем, для отца мы левый сын?

{

Data2. Parent. Left = null;

}if (Data2. Parent. Right!= null && (Data2. Value as Notebook).CompareTo (Data2. Parent. Right. Value) == 0) // Определяем, для отца мы правый сын?

{

Data2. Parent. Right = null;

}

}

}if (Data2. Left!= null) // Если Data2 (максимальный из левого поддерева) имеет левого сына

{<T> Stock = Data2. Left; //Stock - запас2. Left = null; // Удаление связи между отцом (текущим узлом) и левым сыном

Data2. Parent. Right = Stock;. Parent = Data2. Parent;(Data. Parent!= null) // Если удаляемый элемент не корень

{. Parent = Data. Parent;(Data. Parent. Left!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Left. Value) == 0) // Определяем, для отца (удаляемого элемента) мы левый сын?

{. Parent. Left. Value = Data2. Value;

}if (Data. Parent. Right!= null && (Data. Value as Notebook).CompareTo (Data. Parent. Right. Value) == 0) // Определяем, для отца (удаляемого элемента) мы правый сын?

{. Parent. Right. Value = Data2. Value;

}

Data = null;

}

else // Значит удаляемый элемент - это корень

{

Data. Value = Data2. Value;

}

}

}

else // Была обнаруженна ошибка в дереве (т.к. не один из критериев не подходит)

{

throw new Exception («Дерево построенно с ошибкой»);

}

}

else

{

MessageBox. Show («Данного контактного лица не существует», «Ошибка удаления», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

}

catch (Exception error)

{

MessageBox. Show (error. Message + «\nНажмите ОК чтобы продолжить», «Ошибка удаления», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

}

public Node<T> Top (Node<T> Data) // Поиск максимального элемента

{Stop = false;(Stop!=true)

{(Data. Right!= null && Data < Data. Right)

{

Data++; // Сделать текущим правого сына

}

{= true;

}

}Data;

}

Node<T> Least (Node<T> Data) // Поиск максимального элемента

{Stop = false;(Stop!= true)

{(Data. Left!= null && Data > Data. Left)

{

Data-; // Сделать текущим левого сына

}

{= true;

}

}Data;

}

void Loading (TreeView Tree, DataGridView Table)

{

{. Rows. Clear(); // Таблица. Nodes. Clear(); // Дерево<Node<T>> Stack = new Stack<Node<T>>();[] Find;<T> Data = this;Stop = false;. Nodes. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes. Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString();(Data!= null) // Если корень не пустой

{. Push(Data);(Stack. Count > 0)

{= Stack. Pop();(Data. Parent== null && Data. Left == null && Data. Right == null)

{. Rows. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}(Data. Parent!= null) // Если текущий элемент не корень

{. ShowNodeToolTips = true;= Tree. Nodes. Find((Data. Parent. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. Nodes. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes. Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString();

}(Stop!= true)

{(Data. Left!= null && Data. Right!= null)

{. Push (Data. Right);. Rows. Add((Data. Left. Value as Notebook).FIO_OutPut, (Data. Left. Value as Notebook).date_OutPut, (Data. Left. Value as Notebook).view_OutPut);. Rows. Add((Data. Right. Value as Notebook).FIO_OutPut, (Data. Right. Value as Notebook).date_OutPut, (Data. Right. Value as Notebook).view_OutPut);(Data. Parent == null) // Значит корень

{. Rows. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}; // Сделать текущим левого сына= Tree. Nodes. Find((Data. Parent. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. Nodes. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes. Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString();

}if (Data. Left!= null && Data. Right == null)

{. Rows. Add((Data. Left. Value as Notebook).FIO_OutPut, (Data. Left. Value as Notebook).date_OutPut, (Data. Left. Value as Notebook).view_OutPut);(Data. Parent == null) // Значит корень

{. Rows. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}; // Сделать текущим левого сына= Tree. Nodes. Find((Data. Parent. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. Nodes. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).FIO_OutPut);= Tree. Nodes. Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. ToolTipText = «Дата и время:» + (Data. Value as Notebook).date_OutPut + «\nМероприятие:» + (Data. Value as Notebook).view_OutPut. ToString();

}if (Data. Left == null && Data. Right!= null)

{. Rows. Add((Data. Right. Value as Notebook).FIO_OutPut, (Data. Right. Value as Notebook).date_OutPut, (Data. Right. Value as Notebook).view_OutPut);(Data. Parent == null) // Значит корень

{. Rows. Add((Data. Value as Notebook).FIO_OutPut, (Data. Value as Notebook).date_OutPut, (Data. Value as Notebook).view_OutPut);

}. Push (Data. Right);= true;

}

{= true;

}

} //while (Stop)(Stack. Count > 0)

{= false;

}

} //while (Stack)

} //if (Если корень не пуст)

else // Поиск произошёл неудачно

{

throw new Exception («Отсутствует корень дерева»);

}

}(Exception error)

{. Show (error. Message + «\nНажмите ОК чтобы продолжить», «Ошибка загрузки бинарноего дерева в \ «Таблицу и Дерево\"», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

}

void Preservation (string Path2) // Сохранение

{= Path2;Write = new StreamWriter (Path, false, Encoding. Default);<Node<T>> Stack = new Stack<Node<T>>();<T> Data = this;Stop = false; (Data!= null) // Если корень не пустой

{. Push(Data);(Stack. Count > 0)

{= Stack. Pop();(Stop!= true)

{(Data. Left!= null && Data. Right!= null)

{. Push (Data. Right);. WriteLine((Data. Left. Value as Notebook).FIO_OutPut +»;» + (Data. Left. Value as Notebook).date_OutPut +»;» + (Data. Left. Value as Notebook).view_OutPut);. WriteLine((Data. Right. Value as Notebook).FIO_OutPut +»;» + (Data. Right. Value as Notebook).date_OutPut +»;» + (Data. Right. Value as Notebook).view_OutPut);(Data. Parent == null)

{. WriteLine((Data. Value as Notebook).FIO_OutPut +»;» + (Data. Value as Notebook).date_OutPut +»;» + (Data. Value as Notebook).view_OutPut);

}

Data-; // Сделать текущим левого сына

}

else if (Data. Left!= null && Data. Right == null)

{. WriteLine((Data. Left. Value as Notebook).FIO_OutPut +»;» + (Data. Left. Value as Notebook).date_OutPut +»;» + (Data. Left. Value as Notebook).view_OutPut);(Data. Parent == null)

{. WriteLine((Data. Value as Notebook).FIO_OutPut +»;» + (Data. Value as Notebook).date_OutPut +»;» + (Data. Value as Notebook).view_OutPut);

}

Data-; // Сделать текущим левого сына

}

else if (Data. Left == null && Data. Right!= null)

{. WriteLine((Data. Right. Value as Notebook).FIO_OutPut +»;» + (Data. Right. Value as Notebook).date_OutPut +»;» + (Data. Right. Value as Notebook).view_OutPut);(Data. Parent == null)

{. WriteLine((Data. Value as Notebook).FIO_OutPut +»;» + (Data. Value as Notebook).date_OutPut +»;» + (Data. Value as Notebook).view_OutPut);

}. Push (Data. Right);= true;

}

{= true;

}

}(Stack. Count > 0)

{= false;

}

} //while (Stop). Close();

} //if (Если корень не пуст)

}

static Node<T> operator ++(Node<T> Data) // Сделать текущим правого сына

{Data = Data. Right;

}

static Node<T> operator - (Node<T> Data) // Сделать текущим левого сына

{Data = Data. Left;

}

static bool operator >(Node<T> Data, Node<T> Data2) // Сравнение «Больше»

{((Data. Value as Notebook).CompareTo((Data2. Value as Notebook)) == 1)

{true;

}

{false;

}

}

static bool operator <(Node<T> Data, Node<T> Data2) // Сравнение «Меньше»

{((Data. Value as Notebook).CompareTo((Data2. Value as Notebook)) == -1)

{true;

}

{false;

}

}

} // Дерево

Notebook: IComparable // Класс «Записная книжка»

{

string FIO;

string date;

enum views {Благотворительный_праздник, Дефиле, Свадьба, Крестины, День_рождение, Вечеринка, Турнир, Экскурсия, Фестиваль, Спектакль, Выставка, Ярмарка, Конкурс, Марафон, Конгресс, Парад};

views view;string[] sports = Enum. GetNames (typeof(views));

string FIO_OutPut // Свойство для получения «FIO»

{

{this.FIO;

}

{= value;

}

}

string date_OutPut // Свойство для получения «date»

{

{this.date;

}

}

string view_OutPut // Свойство для получения «view»

{

{Enum. GetName (typeof(views), view);

}

}

public Notebook() // Пустой конструктор без параметров (для обращения к методам)

{

}

Notebook (string FIO, string date, string view)

{.FIO = FIO;.date = date;.view = (views) Enum. Parse (typeof(views), view);

}

int CompareTo (object Data) // Сравнение с «Object»

{(string. Compare (this.FIO, (Data as Notebook).FIO) > 0) return 1;(string. Compare (this.FIO, (Data as Notebook).FIO) < 0) return -1;return 0;

}

int CompareTo (string Data) // Сравнение со «String»

{(string. Compare (this.FIO, Data)==1) return 1;(string. Compare (this.FIO, Data)==-1) return -1;return 0;

}

bool Compare_Enum (string view)

{(Enum. IsDefined (typeof(views), view) == true)

{true;

}

{false;

}

}

} // Класс «Notebook»

void открытьToolStripMenuItem_Click (object sender, EventArgs e)

{

if (ekz == null) // Если корня нет (то есть дерево пусто)

{

openFileDialog1. Filter = «Текстовый файл | *.txt»;

if (openFileDialog1. ShowDialog() == DialogResult.OK)

{

сохранитьToolStripMenuItem. Visible = true;

Работа с даннымиToolStripMenuItem. Visible = true;

сохранитьКакToolStripMenuItem. Visible = true;[] str;= new StreamReader (openFileDialog1. FileName, Encoding. Default); //Cоздание «потокового читателя» и связывание его с файловым потоком

Path = openFileDialog1. FileName; // Сохранение пути к текущему файлу

string strokFile = Read. ReadLine();view = new Notebook();(strokFile!= null)

{(strokFile!= null) // Загрузка файла в дерево

{

str = strokFile. Split (';'); // Отделение слов

try

{

if (ekz == null) // Если корня нет

{(view. Compare_Enum (str[2]) == true)

{= new Node<Notebook>(new Notebook (str[0], str[1], str[2]));

}

{++;

}

}

{(view. Compare_Enum (str[2]) == true)

{. Add (new Notebook (str[0], str[1], str[2]));

{++;

}

}

}(Exception)

{++;

}

{= Read. ReadLine();

}

}. Loading (treeView1, dataGridView1);(k > 0)

{. Show («Обнаруженно некоректных записей:» + k. ToString(), «Открыть файл», MessageBoxButtons.OK, MessageBoxIcon. Information);

}. Close();

}

}

}

{= MessageBox. Show («Сохранить текущий файл?», «Информация», MessageBoxButtons. YesNo, MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)

{. Preservation(Path);

}if (DialogResult == DialogResult. No)

{= 0;= null;

сохранитьToolStripMenuItem. Visible = false;

Работа с даннымиToolStripMenuItem. Visible = false;

сохранитьКакToolStripMenuItem. Visible = false;. Rows. Clear();. Nodes. Clear();. Show («Текущая сессия обнулена, теперь можете открыть новый файл», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);

}

}

}

void древовидностьToolStripMenuItem_Click (object sender, EventArgs e)

{. Visible = false;. Visible = true;

}

void таблицаToolStripMenuItem_Click (object sender, EventArgs e)

{. Visible = true;. Visible = false;

}

void сохранитьToolStripMenuItem_Click (object sender, EventArgs e)

{. Preservation(Path);

}void изменитьToolStripMenuItem_Click (object sender, EventArgs e)

{f = new Form2 ();(f. ShowDialog()==DialogResult.OK)

{. Sub (f.textBox1. Text, f.textBox2. Text);. Loading (treeView1, dataGridView1);

}

}

void удалениеToolStripMenuItem_Click (object sender, EventArgs e)

{f = new Form3 ();. Text = «Удаление»;.label1. Text = «Введите значение для удаления»;

f.button1. Text = «Удалить»;(f. ShowDialog() == DialogResult.OK)

{. Removal (f.textBox1. Text);. Loading (treeView1, dataGridView1);

}

}

void сохранитьКакToolStripMenuItem_Click (object sender, EventArgs e)

{. Filter = «Текстовый файл | *.txt»;(saveFileDialog1. ShowDialog() == DialogResult.OK)

{. Preservation (saveFileDialog1. FileName);

}

}

void вставкаToolStripMenuItem_Click (object sender, EventArgs e)

{view = new Notebook();f = new Form4 ();(int i = 0; i < view.sports. Count(); i++)

{.comboBox1. Items. Add (view.sports[i]);

}(f. ShowDialog() == DialogResult.OK)

{. Add (new Notebook (f.textBox1. Text, f.textBox2. Text, f.comboBox1. Text));. Loading (treeView1, dataGridView1);

}

}

void Form1_FormClosing (object sender, FormClosingEventArgs e)

{(ekz!=null)

{= MessageBox. Show («Сохранить информацию?», «Информация», MessageBoxButtons. YesNoCancel, MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)

{. Preservation(Path);

}if (DialogResult == DialogResult. No)

{();

}if (DialogResult == DialogResult. Cancel)

{();

}

}

}

void поискЭлементаToolStripMenuItem_Click (object sender, EventArgs e)

{f = new Form3 ();. Text = «Поиск»;.label1. Text = «Введите значение для поиска»;

f.button1. Text = «Поиск»;(f. ShowDialog() == DialogResult.OK)

{. Quest (f.textBox1. Text, dataGridView1, treeView1);

}

}

static TreeNode[] Coloor_Blue = null;

void поискToolStripMenuItem1_Click (object sender, EventArgs e)

{<Notebook> Data = ekz;= ekz. Top(Data);(ekz!= null) // Если корень есть

{i = 0;Stop = false;(dataGridView1. Rows. Count > i)

{(dataGridView1. Rows[i].DefaultCellStyle. BackColor == Color. Blue)

{. Rows[i].DefaultCellStyle. BackColor = Color. White;;

}

{++;

}

}(Coloor_Blue!=null)

{. SelectedNode = Coloor_Blue[0];. SelectedNode. BackColor = Color. White;

}= 0;(Stop!= true)

{(dataGridView1 [0, i].Value. ToString() == (Data. Value as Notebook).FIO_OutPut)

{. Rows[i].DefaultCellStyle. BackColor = Color. Blue;[] Find = treeView1. Nodes. Find((Data. Value as Notebook).FIO_OutPut, true);. SelectedNode = Find[0];. SelectedNode. BackColor = Color. Blue;= true;

}

{++;

}

}. Show («Максимальный элемент выделен синим цветом.\nДля снятия выделения цветом, кликните левой кнопкой мыши в любом месте строки», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);

}

{. Show («Данного контактного лица не существует», «Ошибка поиска максимального элемента», MessageBoxButtons.OK, MessageBoxIcon. Error);

}

}

void dataGridView1_CellClick (object sender, DataGridViewCellEventArgs e)

{(dataGridView1. CurrentRow. DefaultCellStyle. BackColor == Color. Green || dataGridView1. CurrentRow. DefaultCellStyle. BackColor == Color. Blue)

{. CurrentRow. DefaultCellStyle. BackColor = Color. White;

}

}

void treeView1_Click (object sender, EventArgs e)

{(treeView1. SelectedNode. BackColor == Color. Green || treeView1. SelectedNode. BackColor == Color. Blue)

{. SelectedNode. BackColor = Color. White;

}

}

void обАвтореToolStripMenuItem_Click (object sender, EventArgs e)

{

MessageBox. Show («Выполнил Дробышевский Дмитрий Александрович ПО-32, 2014 г.\nОснованием для разработки курсового проекта служит задание выданное преподавателем Ясоновым А.А.», «Об авторе», MessageBoxButtons.OK, MessageBoxIcon. Information);

}

void справкаToolStripMenuItem_Click (object sender, EventArgs e)

{f = new Form5 ();. ShowDialog();

}

}

}

Текст программы Form2.cs

System;System. Collections. Generic;System. ComponentModel;System. Data;System. Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows. Forms;Курсовая_работа

{partial class Form2: Form

{Form2 ()

{();

}void button1_Click (object sender, EventArgs e)

{(textBox1. Text!= «» && textBox2. Text!= «»)

{= DialogResult.OK;();}if (textBox1. Text!= «» && textBox2. Text == «»)

{. Show («В поле \ «Новое значение\» отсутствует значение», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);

}if (textBox1. Text == «» && textBox2. Text!= «»)

{. Show («В поле \ «Старое значение\» отсутствует значение», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);}

}void Form2_FormClosing (object sender, FormClosingEventArgs e)

{if ((textBox1. Text!=»» && DialogResult!= DialogResult.OK) || (textBox2. Text!=»» && DialogResult!= DialogResult.OK))

{= MessageBox. Show («В текстовом поле обнаружена информация, вы уверены что хотите выйти?», «Информация», MessageBoxButtons. YesNo, MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)

{Dispose();}

{();

}

}

}

}

}

Текст программы Form3.cs

System;System. Collections. Generic;System. ComponentModel;System. Data;System. Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows. Forms;

Курсовая_работа

{partial class Form3: Form

{Form3 ()

{();

}void button1_Click (object sender, EventArgs e)

{(textBox1. Text!= «»)

{= DialogResult.OK;();

}if (textBox1. Text == «»)

{. Show («В поле \"» + label1. Text + «\» отсутствует значение», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);

}

}void Form3_FormClosing (object sender, FormClosingEventArgs e)

{(textBox1. Text!=»» && DialogResult!= DialogResult.OK)

{= MessageBox. Show («В текстовом поле обнаружена информация, вы уверены что хотите выйти?», «Информация», MessageBoxButtons. YesNo, MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)

{();

}

{();

}

}

}

}

}

Текст программы Form4.cs

System;System. Collections. Generic;System. ComponentModel;System. Data;System. Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows. Forms;Курсовая_работа

{partial class Form4: Form

{Form4 ()

{();

}void button1_Click (object sender, EventArgs e)

{(textBox1. Text!= «» && textBox2. Text!= «» && textBox3. Text!= «» && comboBox1. Text!= null)

{= DialogResult.OK;();

}

{. Show («Не все поля заполненны», «Информация», MessageBoxButtons.OK, MessageBoxIcon. Information);

}

}void Form4_FormClosing (object sender, FormClosingEventArgs e)

{((textBox1. Text!= «» && DialogResult!= DialogResult.OK) || (textBox2. Text!= «» && DialogResult!= DialogResult.OK) || (textBox3. Text!= «» && DialogResult!= DialogResult.OK) || (comboBox1. Text!= «» && DialogResult!= DialogResult.OK))

{= MessageBox. Show («В текстовом поле обнаружена информация, вы уверены что хотите выйти?», «Информация», MessageBoxButtons. YesNo, MessageBoxIcon. Question);(DialogResult == DialogResult. Yes)

{Dispose();}

{();

}

}

}

}

}

Текст программы Form5.cs

System;System. Collections. Generic;System. ComponentModel;System. Data;System. Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows. Forms;

Курсовая_работа

{partial class Form5: Form

{Form5 ()

{();

Похожие работы на - Построение бинарного дерева

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!