- •Модуль 3. Лекція 12. Дерева
- •1. Дерево як абстрактна структура даних
- •2. Обхід дерева в глибину (dfs - Depth-First Search)
- •3. Обхід дерева в ширину. Алгоритм Breath-First-Search (bfs)
- •4. Елемент управління TreeView у Windows Form
- •4.1. Створення дерева TreeView з використанням вікна властивостей
- •4.2. Програмне створення дерева і робота з ним
- •Спочатку потрібно створити форму і розмістити на ній елемент TreeView.
- •Написати метод формування дерева. Метод викликати з конструктора чи з методу Load.
- •Обхід дерева.
- •Видалення вузла.
- •Додавання (вставка) вузлів
- •Робота з листями дерева.
3. Обхід дерева в ширину. Алгоритм Breath-First-Search (bfs)
Алгоритм BFS спочатку проходить через початковий вузол, потім всі його прямі нащадки, потім їхні прямі нащадки і так далі.
Пошук у ширину |
F, B, G, A, D, I, C, E, H.
|
В цьому прикладі для зберігання вузлів використовується черга.
Алгоритм BFS складається з наступних кроків:
Додайте до черги кореневий вузол.
Додайте до черги всіх нащадків.
Алгоритм BFS дуже простий і завжди проходить спочатку вузли, найближчі до початкового вузла, а потім більш віддалені і так далі, поки не досягне найвіддаленішого. Алгоритм BFS широко використовується у вирішенні проблем, наприклад, для знаходження найкоротшого шляху в лабіринті.
Приклад 5. Обхід дерева каталогів файлової системи у ширину
Алгоритм Breath-First-Search (BFS)
using System;
using System.Collections.Generic;
using System.IO;
namespace DirectoryTraverserBFS
{
/// <summary>
/// Sample class, which traverses given directory
/// based on the Breath-First-Search (BFS) algorithm
/// </summary>
public static class DirBFS
{
/// <summary>
/// Traverses and prints given directory with BFS
/// </summary>
/// <param name="directoryPath">the path to the directory
/// which should be traversed</param>
static void TraverseDir(string directoryPath)
{
Queue<DirectoryInfo> visitedDirsQueue = new Queue<DirectoryInfo>();
visitedDirsQueue.Enqueue(new DirectoryInfo(directoryPath));
while (visitedDirsQueue.Count > 0)
{
DirectoryInfo currentDir = visitedDirsQueue.Dequeue();
Console.WriteLine(currentDir.FullName);
DirectoryInfo[] children = currentDir.GetDirectories();
foreach (DirectoryInfo child in children)
{
visitedDirsQueue.Enqueue(child);
}
}
}
static void Main()
{
TraverseDir(@"D:\\МНТУ\\For_КПІ-71\\Алгоритми");
Console.ReadKey();
}
}
}
4. Елемент управління TreeView у Windows Form
TreeView представляє візуальний елемент у вигляді дерева. Дерево містить вузли, які представляють об'єкти TreeNode. Вузли можуть містити інші підвузли і можуть перебувати як згорнутому, так і в розгорнутому стані. Всі вузли містяться у властивості Nodes.
Цей елемент можна створити як на етапі проектування за допомогою вікна властивостей (статично), та і динамічно у коді.
4.1. Створення дерева TreeView з використанням вікна властивостей
Для створення елемента потрібно його перетягти на форму з вікна елементів управління (але спочатку треба створити форму).
Фактично, TreeView є контейнером, в якому розміщується дерево.
Якщо ми натиснемо в панелі властивостей на властивість Nodes, то нам відкриється вікно редагування вузлів TreeView.
https://metanit.com/sharp/windowsforms/4.13.php
Приклад 6. Дерево, яке відображає структуру МНТУ
За допомогою кнопок Добавить корень и Добавить ветвь створимо дерево структури МНТУ.
Корінь дерева – МНТУ, на рівні 1 розташовані Департаменти та факультети, на рівні 2 – кафедри.
Додаємо корінь. Властивості Text призначаємо МНТУ. Можна змінити і властивість Name, а також налаштувати інші властивості елементів, наприклад, колір.
Виділяємо корінь дерева, натискаємо кнопку Добавить ветвь. Властивості Text призначаємо Департаменти.
Знову виділяємо корінь дерева, натискаємо кнопку Добавить ветвь. Властивості Text призначаємо Факультети.
Виділяємо вузол Факультети, натискаємо кнопку Добавить ветвь. Властивості Text призначаємо Комп.наук. Додаємо до цього вузла інші факультети і т.д.
В результаті отримуємо таке дерево:
Крім властивостей, які керують візуалізацією, елемент TreeNode має ще ряд важливих властивостей, які ми можемо використовувати у коді.
Основні властивості:
• FirstNode: перший дочірній вузол
• LastNode: останній дочірній вузол
• NextNode: повертає наступний сестринський вузол по відношенню до поточного
• NextVisibleNode: повертає наступний видимий вузол по відношенню до поточного
• PrevNode: повертає попередній сестринський вузол по відношенню до поточного
• PrevVisibleNode: повертає попередній видимий вузол по відношенню до поточного
• Nodes: повертає колекцію дочірніх вузлів
• Parent: повертає батьківський вузол для поточного вузла
• TreeView: повертає об'єкт TreeView, в якому визначено поточний вузол
Основні події:
TreeView має ряд подій, які дозволяють нам управляти деревом. Найбільш важливі з них:
• BeforeSelect / AfterSelect: спрацьовує перед / після вибору вузла дерева
• BeforeExpand / AfterExpand: спрацьовує перед / після розкриття вузла дерева
• BeforeCollapse / AfterCollapse: спрацьовує перед / після приховування вузла дерева.
Основні методи:
Add – додає новий вузол
Expand() – розгортає вузол і всі його підлеглі вузли
ExpandAll() – розгортає все дерево
Remove(node) – видаляє вузол node.
