Технологии программирования 5 лаба. Бинарные деревья. Лаба 5 ТП. 1 Цель Цель познакомится с бинарными деревьями. Изучить создание собственных типов данных с помощью класса. Научится создавать оконные приложения с помощью Windows Forms. Задания
Скачать 72.39 Kb.
|
1 Цель Цель: познакомится с бинарными деревьями. Изучить создание собственных типов данных с помощью класса. Научится создавать оконные приложения с помощью Windows Forms. Задания: Последовательность букв представить в виде идеально сбалансированного бинарного дерева. Вывести на экран дерево и все слои дерева, начиная с вершины, а затем - с корня. 2 Листинг программного кода using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace сем2_Лабораторная_5_БАЗА { public partial class Form1 : Form { private Tree osinka; public Form1() { InitializeComponent(); } private void выходToolStripMenuItem_Click(object sender, EventArgs e) { Close(); } private void загрузитьДанныеToolStripMenuItem_Click(object sender, EventArgs e) { int k = 0; string[] mastree; int elementscount = 0; string Element = ""; textBoxTree.Clear(); textBoxBypass.Clear(); try { if (openFileDialog1.ShowDialog() == DialogResult.OK) { osinka = new Tree();// создать новое дерево textBoxTree.Clear(); using (var file = new System.IO.StreamReader(openFileDialog1.FileName)) { while (file.Peek() > 0) { Element +=( file.ReadLine() + " " ); elementscount++; } } } } catch { MessageBox.Show("Ошибка ввода", "Графы", MessageBoxButtons.OK, MessageBoxIcon.Question); } mastree = Element.Split(' '); string results = ""; string invertresult = ""; foreach (string elem in mastree) { if (elem != "") { osinka.Add(elem, k); k++; } } int step = 0; for (; Math.Pow(2, step) < mastree.Length; step++) { } string []ouy = new string[step]; textBoxBypass.Text += "Слои с корня" + Environment.NewLine; for (int i = 0; true; i++) { if (Math.Pow(2, i) > mastree.Length) break; for (int j = 0; j < (Math.Pow(2, i + 1) - Math.Pow(2, i)); j++) { int bn = j + Convert.ToInt32(Math.Pow(2, i)) - 1; if (bn == mastree.Length) break; invertresult += mastree[bn]; invertresult += " "; } invertresult += "Слой "; invertresult += i; invertresult += Environment.NewLine; ouy[i] = invertresult; invertresult = ""; } foreach (string elem in ouy) { textBoxBypass.Text +=elem; } textBoxBypass.Text += "Слои с конца" + Environment.NewLine; for (int y = ouy.Length-1;y>=0;y--) textBoxBypass.Text += ouy[y]; osinka.Output(ref results); textBoxTree.Text += results; } } } Листинг класса Tree using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace сем2_Лабораторная_5_БАЗА { public class Tree { public class TreeNode { public string Value; // значение ключа public int Count = 1; public bool Full;// количество одинаковых ключей public TreeNode Left; // левое поддерево public TreeNode Right; // правое поддерево } public TreeNode Node; // экземпляр класса "Поддерево" bool left = true; public void Add(string val, int count)// добавление элемента - интерфейсный метод { bool INIright = Convert.ToBoolean( count % 2); AddChildren(ref Node, val,INIright); } public void Output(ref string s) // вывод данных в форму - интерфейсный метод { s = ""; // обнуляем строку OutputTree(Node, 0, ref s); } //Инкапсулированные методы //ref TreeNode Node - текущий "элемент дерева" private void AddChildren(ref TreeNode node, string val, bool right) { if (node == null) { node = new TreeNode(); node.Value = val; } else { if ((node.Right == null) && (node.Left == null)) AddChildren(ref node.Right, val, right); else if ((node.Right != null) && (node.Left == null)) { node.Full = true; AddChildren(ref node.Left, val, right); } else if (node.Full) { if (node.Right.Full && node.Left.Full) { if(right) AddChildren(ref node.Right, val, right); else AddChildren(ref node.Left, val, right); } else if (node.Right.Full) AddChildren(ref node.Left, val, right); else AddChildren(ref node.Right, val, right); } } } private void OutputTree(TreeNode root, int spaces, ref string s) { if (root != null) { for (int i = 0; i < root.Count; i++) { for (int j = 0; j <= spaces; j++) if (j == 0) s += "|"; else s += " -"; s += " "; s += root.Value.ToString(); s += Environment.NewLine; } OutputTree(root.Left, spaces + 1, ref s); OutputTree(root.Right, spaces + 1, ref s); } } } } 3 Экранная форма Рисунок 1 – Пример работы программы Вывод: в ходе работы проведено ознакомление с бинарными деревьями. Была совершена проба создания собственного типа данных с помощью класса. Получены навыки создания оконных приложений с помощью Windows Forms. |