Двоичное дерево на форме
Создать и отобразить на форме приложения двоичное упорядоченное дерево, содержащее числа. Указать мышкой вершину этого дерева, после чего найти в этом дереве все вершины с числами такой же четности, как и указанная вершина, выделить их другим цветом, и определить количество этих вершин.
Написал форму которая рисует дерево. а дальше все встело. помогите с кодом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Windows.Forms; namespace Курсовая_Вар_16 { class Verhina { //параметры дерева const int R = 20; int n; Verhina left; Verhina right; Color color; //типо конструктор public Verhina(int n) { this.n = n; left = right = null; color = Color.White; } //добавляем вершины internal void DobavimVershinu(int n) { if (n == this.n) { MessageBox.Show("Такая вершина уже есть!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (n this.n) { if (left == null) left = new Verhina(n); else left.DobavimVershinu(n); } else { if (right == null) right = new Verhina(n); else right.DobavimVershinu(n); } } //далее идет рисование кружочков и стрелочек на форме internal void Risovat(Graphics g, int x1, int x2, int y, int dy) { int x = (x1 + x2) / 2; if (left != null) { g.DrawLine(Pens.Blue, x, y, x - (x2 - x1) / 4, y+ dy); } if (right != null) { g.DrawLine(Pens.Blue, x, y, x + (x2 - x1) / 4, y+ dy); } g.FillEllipse(new SolidBrush(color), x - R, y - R, 2* R, 2 * R); g.DrawEllipse(Pens.Black, x - R, y - R, 2 * R, 2 * R); g.DrawString(n.ToString(), new Font("Calibri", 14),Brushes.Red, x - 12, y - 10); if (left != null) { left.Risovat(g, x1, x, y + dy, dy); } if (right != null) { right.Risovat(g, x, x2, y + dy, dy); } } public int Search(int vSh, int x1, int x2, int y, int dy) { Graphics g; int count = 0; if (n % vSh == 0) count += 1; if (n % vSh == 0) { if (left != null) g.FillEllipse(new SolidBrush(Color.Blue), x1 - R, y - R, 2 * R, 2 * R); count += left.Search(vSh , x1, x2, y, dy); if (right != null) g.FillEllipse(new SolidBrush(Color.Blue), x1 - R, y - R, 2 * R, 2 * R); count += right.Search(vSh, x1, x2, y, dy); } else { if (left != null) g.FillEllipse(new SolidBrush(Color.Blue), x1 - R, y - R, 2 * R, 2 * R); count += left.Search(vSh, x1, x2, y, dy); if (right != null) g.FillEllipse(new SolidBrush(Color.Blue), x1 - R, y - R, 2 * R, 2 * R); count += right.Search(vSh, x1, x2, y, dy); } return count ; } //вот далее идет магия и я хз как это работает internal Verhina PoiskVeshiny(int xm, int ym, int x1, int x2, int y, int dy) { int x = (x1 + x2) / 2; int rasst = (int)Math.Sqrt((xm - x) * (xm - x) + (ym - y) * (ym - y)); if (rasst R) { return this; } if (xm x) { if (left == null) return null; else return left.PoiskVeshiny(xm, ym, x1, x, y + dy, dy); } else { if (right == null) return null; else return right.PoiskVeshiny(xm, ym, x, x2, y + dy, dy); } } internal void SetColor(Color color) { this.color = color; } internal int GetN() { return n; } } class Tree { Verhina koren; public Tree() { koren = null; } internal void DobavimVershinu(int n) { if (koren == null) koren = new Verhina(n); else koren.DobavimVershinu(n); } internal void Risovat(Graphics g, int x1, int x2, int y0, int dy) { if (koren == null) return; koren.Risovat(g, x1, x2, y0, dy); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Курсовая_Вар_16 { public partial class Form1 : Form { Tree derevo; Verhina v1; int y0 = 60; int dy = 75; int x1 = 0; int x2; public Form1() { InitializeComponent(); derevo = new Tree(); v1 = null; } private void Button1(object sender, EventArgs e) { // Добавляем вершину в дерево string n = textBox1.Text; int z = 0; try { z = Convert.ToInt32(n); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } derevo.DobavimVershinu(z); this.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { } private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = this.CreateGraphics(); g.Clear(Color.DarkOrange);//цвет формы x2 = this.ClientSize.Width; derevo.Risovat(g, x1, x2, y0, dy); } public void Form1_M(object sender, MouseEventArgs e) { // v1.Search(); x2 = this.ClientSize.Width; Invalidate(); } } }
Источник
Отрисовка бинарного дерева на WindowsForm в C#
Бинарное дерево – это структура данных, состоящая из узлов, которые имеют максимум двух потомков. Одна из самых распространенных задач по работе с бинарными деревьями – отрисовка их на экране.
WindowsForm – это средство разработки интерфейса для приложений под операционную систему Windows с использованием языка программирования C#. В данной статье рассматривается процесс отрисовки бинарного дерева на WindowsForm в C#.
Необходимые компоненты
Для отображения бинарного дерева на WindowsForm в C# нужны следующие компоненты:
- PictureBox – компонент для отображения картинки;
- Graphics – класс для работы с графическим редактором;
- Pen – класс для настройки линии, которой будет рисоваться дерево;
- Brush – класс для настройки заливки фигур.
Реализация отрисовки
Для реализации отрисовки бинарного дерева на WindowsForm в C# нужно выполнить следующие действия:
Graphics g = pictureBox1.CreateGraphics();
- Нарисовать линии между узлами дерева. Для этого нужно пройти циклом по всем узлам дерева и соединить их линией:
Pen pen = new Pen(Color.Black, 2); // . g.DrawLine(pen, point1, point2);
- Нарисовать круги, представляющие узлы дерева. Для этого нужно также пройти циклом по всем узлам, и для каждого узла нарисовать круг:
Brush brush = new SolidBrush(Color.White); // . g.FillEllipse(brush, rectangleF); g.DrawEllipse(pen, rectangle);
- Нарисовать значения узлов дерева в кругах. Для этого нужно записать значения каждого узла дерева внутри соответствующего круга:
string nodeValue = node.Value.ToString(); Font font = new Font("Arial", 18, FontStyle.Bold); g.DrawString(nodeValue, font, Brushes.Black, rectangleF);
Также нужно реализовать методы для получения координат узлов дерева и настройки их отображения (размеры кругов, отступы и т.д.).
Заключение
Отрисовка бинарного дерева на WindowsForm в C# – это задача, которая может показаться сложной для новичков в программировании. Однако, следуя вышеописанным шагам, можно реализовать отрисовку дерева сравнительно легко. Главное – это понимание, какие компоненты и методы использовать.
Источник
Бинарное дерево windows forms
TreeView представляет визуальный элемент в виде дерева. Дерево содержит узлы, которые представляют объекты TreeNode . Узлы могут содержать другие подузлы и могут находиться как скрытом, так и в раскрытом состоянии. Все узлы содержатся в свойстве Nodes .
Если мы нажем в панели Свойств на свойство Nodes , то нам откроется окно редактирования узлов TreeView:
В этом окне мы можем добавить новые узлы, создать для них подузлы, удалить уже имеющиеся, настроить свойства узлов. Рассмотрим некоторые свойства, которые мы здесь может установить:
- BackColor : фоновый цвет узла
- Checked : если равно true, то данный узел будет отмечен флажком
- NodeFont : шрифт узла
- ForeColor : цвет шрифта
- Text : текст узла
- ImageIndex : получает или задает индекс изображения, выводимого для данного узла
- ImageKey : получает или задает индекс изображения для данного узла
- SelectedImageKey : получает или задает индекс изображения для данного узла в выбранном состоянии
- SelectedImageIndex : получает или задает индекс изображения, выводимого для данного узла в выбранном состоянии
- StateImageIndex : получает или задает индекс изображения состояния (например установленного или снятого флажка, указывающего состояние элемента)
- Tag : тег узла
И затем все добавленные узлы мы сможем увидеть в приложении на форме:
Кроме данных свойств, управляющих визуализацией, элемент TreeNode имеет еще ряд важных свойств, которые мы можем использовать к коде:
- FirstNode : первый дочерний узел
- LastNode : последний дочерний узел
- NextNode : возвращает следующий сестринский узел по отношению к текущему
- NextVisibleNode : возвращает следующий видимый узел по отношению к текущему
- PrevNode : возвращает предыдущий сестринский узел по отношению к текущему
- PrevVisibleNode : возвращает предыдущий видимый узел по отношению к текущему
- Nodes : возвращает коллекцию дочерних узлов
- Parent : возвращает родительский узел для текущего узла
- TreeView : возвращает объект TreeView, в котором определен текущий узел
Программное управление узлами
Рассмотрим программное добавление и удаление узлов:
TreeNode tovarNode = new TreeNode("Товары"); // Добавляем новый дочерний узел к tovarNode tovarNode.Nodes.Add(new TreeNode("Смартфоны")); // Добавляем tovarNode вместе с дочерними узлами в TreeView treeView1.Nodes.Add(tovarNode); // Добавляем второй очерний узел к первому узлу в TreeView treeView1.Nodes[0].Nodes.Add(new TreeNode("Планшеты")); // удаление у первого узла второго дочернего подузла treeView1.Nodes[0].Nodes.RemoveAt(1); // Удаление узла tovarNode и всех его дочерних узлов treeView1.Nodes.Remove(tovarNode);
Скрытие и раскрытие узлов
Для раскрытия узлов к объекту TreeNode применяется метод Expand() , а для скрытия — метод Collapse() :
// раскрытие узла tovarNode.Expand(); // раскрытие не только узла, но и всех его дочерних подузлов tovarNode.ExpandAll(); // скрытие узла tovarNode.Collapse();
Добавление чекбоксов
Чтобы добавить чекбоксы к узлам дерева, надо у TreeView установить свойство CheckBoxes = true :
treeView1.CheckBoxes = true; TreeNode smartNode = new TreeNode("Смартфоны"); smartNode.Checked = true; treeView1.Nodes.Add(smartNode); treeView1.Nodes.Add(new TreeNode("Планшеты")); treeView1.Nodes.Add(new TreeNode("Ноутбуки"));
Добавление изображений
Для добавления изображений нам нужен компонент ImageList, в котором имеется несколько картинок. Добавим эти картинки к узлам:
// установка источника изображений treeView1.ImageList = imageList1; TreeNode argentinaNode = new TreeNode < Text = "Аргентина", ImageIndex=0, SelectedImageIndex=0 >; treeView1.Nodes.Add(argentinaNode); TreeNode braziliaNode = new TreeNode < Text = "Бразилия", ImageIndex = 1, SelectedImageIndex=1 >; treeView1.Nodes.Add(braziliaNode); TreeNode chilieNode = new TreeNode < Text = "Чили", ImageIndex = 2, SelectedImageIndex=2 >; treeView1.Nodes.Add(chilieNode); TreeNode columbiaNode = new TreeNode < Text = "Колумбия", ImageIndex = 3, SelectedImageIndex=3 >; treeView1.Nodes.Add(columbiaNode);
При установке изображений надо учитывать, что если мы не установим свойство SelectedImageIndex для каждого узла, то в качестве картинки для выделенного узла по умолчанию будет использоваться первое изображение из ImageList.
TreeView. Практический пример
Выполним небольшую задачу с TreeView. А именно попробуем сделать примитивный интерфейс на подобие проводника. Для этого добавим на форму элемент TreeView. А в файле кода формы пропишим следующий код:
using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Windows.Forms; namespace HelloApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); treeView1.BeforeSelect += treeView1_BeforeSelect; treeView1.BeforeExpand += treeView1_BeforeExpand; // заполняем дерево дисками FillDriveNodes(); >// событие перед раскрытием узла void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) < e.Node.Nodes.Clear(); string[] dirs; try < if (Directory.Exists(e.Node.FullPath)) < dirs = Directory.GetDirectories(e.Node.FullPath); if (dirs.Length != 0) < for (int i = 0; i < dirs.Length; i++) < TreeNode dirNode = new TreeNode(new DirectoryInfo(dirs[i]).Name); FillTreeNode(dirNode, dirs[i]); e.Node.Nodes.Add(dirNode); >> > > catch (Exception ex) < >> // событие перед выделением узла void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) < e.Node.Nodes.Clear(); string[] dirs; try < if(Directory.Exists(e.Node.FullPath)) < dirs = Directory.GetDirectories(e.Node.FullPath); if (dirs.Length!= 0) < for(int i=0; i> > > catch (Exception ex) < >> // получаем все диски на компьютере private void FillDriveNodes() < try < foreach(DriveInfo drive in DriveInfo.GetDrives()) < TreeNode driveNode = new TreeNode < Text = drive.Name >; FillTreeNode(driveNode, drive.Name); treeView1.Nodes.Add(driveNode); > > catch (Exception ex) < >> // получаем дочерние узлы для определенного узла private void FillTreeNode(TreeNode driveNode, string path) < try < string[] dirs = Directory.GetDirectories(path); foreach (string dir in dirs) < TreeNode dirNode = new TreeNode(); dirNode.Text = dir.Remove(0, dir.LastIndexOf("\\") + 1); driveNode.Nodes.Add(dirNode); >> catch (Exception ex) < >> > >
TreeView имеет ряд событий, которые позволяют нам управлять деревом. Наиболее важные из них:
- BeforeSelect / AfterSelect : срабатывает перед / после выбора узла дерева
- BeforeExpand / AfterExpand : срабатывает перед / после раскрытия узла дерева
- BeforeCollapse / AfterCollapse : срабатывает перед / после скрытия узла дерева
В вышеприведенном коде мы заблаговременно перед раскрытием или выбором наполняем выбранный узел дочерними подузлами, благодаря чему у нас появляется видимость, что узлы заполнены.
Источник