- •Модуль 3. Лекція 12. Дерева
- •1. Дерево як абстрактна структура даних
- •2. Обхід дерева в глибину (dfs - Depth-First Search)
- •3. Обхід дерева в ширину. Алгоритм Breath-First-Search (bfs)
- •4. Елемент управління TreeView у Windows Form
- •4.1. Створення дерева TreeView з використанням вікна властивостей
- •4.2. Програмне створення дерева і робота з ним
- •Спочатку потрібно створити форму і розмістити на ній елемент TreeView.
- •Написати метод формування дерева. Метод викликати з конструктора чи з методу Load.
- •Обхід дерева.
- •Видалення вузла.
- •Додавання (вставка) вузлів
- •Робота з листями дерева.
4.2. Програмне створення дерева і робота з ним
Дерево можна створити у коді з використанням об’єктів класу TreeNode. Це закритий клас класу TreeView.
Приклад 7. Програмне створення дерева, яке відображає структуру МНТУ і реалізація методів обходу вузлів дерева, додавання і видалення вузлів.
Готова форма при виконанні.
Спочатку потрібно створити форму і розмістити на ній елемент TreeView.
Написати метод формування дерева. Метод викликати з конструктора чи з методу Load.
С цьому методі створюються об’єкти вузлів, додаються до своїх вузлів-предків. У об'єктів вузлів призначаються лише властивості Name і Text.
private void CreateTree()
{
//Створення дерева - структура МНТУ
TreeNode rootNode = new TreeNode() { Name = "ISTU", Text = "МНТУ" };
//додаємо корінь дерева в TreeView
treeView1.Nodes.Add(rootNode);
//додавання вузлів
TreeNode node = new TreeNode() { Name = "Depart", Text = "Департаменти" };
treeView1.Nodes[0].Nodes.Add(node);
TreeNode node1 = new TreeNode() { Name = "Facult", Text = "Факультети" };
TreeNode node11 = new TreeNode { Name = "CompScience", Text = "Комп'ютерних наук" };
TreeNode node12 = new TreeNode { Name = "Econom", Text = "Економіки" };
node1.Nodes.Add(node11);
node1.Nodes.Add(node12);
TreeNode node111 = new TreeNode { Name = "KafM", Text = "Кафедра математики" };
TreeNode node112 = new TreeNode { Name = "KafCS", Text = "Кафедра комп.наук" };
node11.Nodes.Add(node111);
node11.Nodes.Add(node112);
TreeNode nodeGroup = new TreeNode { Name = "Group", Text = "Групи" };
node112.Nodes.Add(nodeGroup);
TreeNode nodeK71 = new TreeNode { Name = "К71", Text = "К-71" };
TreeNode nodePI71 = new TreeNode { Name = "PI71", Text = "ПІ-71" };
nodeGroup.Nodes.Add(nodeK71);
nodeGroup.Nodes.Add(nodePI71);
treeView1.Nodes[0].Nodes.Add(node1);
rootNode.ExpandAll();
}
Виклик методу вставимо в метод Load.
private void Form1_Load(object sender, EventArgs e)
{
CreateTree();
}
Обхід дерева.
Рекурсивний алгоритм обходу дерева
метод PrintRecursive(TreeNode treeNode)
полягає у проході по кожному вузлу і виведенні його назви (за допомогою методу MessageBox.Show(treeNode.Text); )
Для перебору вузлів створюється колекція вузлів
TreeNodeCollection nodes = treeView1.Nodes;
Це потрібно для того, щоб можна було перебирати вузли з циклі foreach:
Метод private void btnTraverse_Click(object sender, EventArgs e)
Викликається при натисканні кнопки Обхід дерева.
private void btnTraverse_Click(object sender, EventArgs e)
{
//Обхід вузлів дерева і виведення його вузлів
TreeNodeCollection nodes = treeView1.Nodes;
foreach (TreeNode n in nodes)
{
PrintRecursive(n);
}
}
private void PrintRecursive(TreeNode treeNode)
{
// рекурсивний метод виведення кожного вузла.
MessageBox.Show(treeNode.Text);
foreach (TreeNode tn in treeNode.Nodes)
{
PrintRecursive(tn);
}
}