81
//
вставка
{
if (t == null)
t = new Node(null, null, data, x, y);
else
if (data <= Convert.ToInt32(t.data))
Insert(ref t.left, data, t.x - step,
t.y + dh * step);
else
Insert(ref t.right, data, t.x + step,
t.y + dh* step);
}
Следует отметить, что в данной функции параметр
t передается как па-
раметр-переменная, а не как параметр-значение в функциях листинга 4.1. Это
существенно, поскольку в случае включения
нового узла параметру-
переменной должно присваиваться новое значение – ссылка на включенный
узел, старое значение параметра было равно
null.
Рис. 4.2. Форма для работы с деревьями
На рисунке 4.2 приведена форма проекта «Упорядоченное дерево», со-
держащая следующие элементы управления:
−
текстовое поле, в котором вводятся значения для узлов дерева;
12 / 23
82
− кнопка «Создать дерево», при нажатии на которую генерируется
последовательность случайных чисел, на ее основе создается упо-
рядоченное дерево и строится его изображение;
− кнопка «Найти узел», при нажатии на которую ищется узел дере-
ва с указанным значением;
− кнопка «Добавить узел», при нажатии на которую в дерево добав-
ляется узел с указанным значением информационного поля;
− кнопка «Удалить узел», при нажатии на которую удаляется узел с
указанным значением;
Построение упорядоченного дерева производится с
помощью приве-
денной выше процедуры
Insert().
Листинг 4.5. Создание дерева
private void btnCreate_Click(object sender, Even-
tArgs e)
{
int L = textBox1.Lines.Count();
for (int i = 0; i < L; i++)
{
if (textBox1.Lines[i] != "")
{
int k = Convert.ToInt32(textBox1.Lines[i]);
myTree.Insert(ref myTree.top, k, 200, 40);
}
}
MyDraw();
}
Рисование же дерева использует алгоритм
обхода дерева способом
«сверху-вниз», поэтому построение изображения
дерева начинается с его
корня. Затем рисуются узлы левого поддерева, затем правого. При прорисов-
ке узла запоминаются его координаты, которые используются как при прори-
совке ветвей текущего дерева, так и при повторной прорисовке дерева, если
менять мышкой положение его узлов на форме. Основные процедуры приве-
дены в листинге 4.6.
13 / 23