//Подсчет кол-ва листьев public static void LeavesCount(PointTree p, ref int rez) { if (p != null) { LeavesCount(p.Left, ref rez); if (p.Left == null && p.Right == null) { rez++; } LeavesCount(p.Right, ref rez); } }
//печать дерева по уровням private static void ShowTree(PointTree p, int l) { if (p != null) { ShowTree(p.Right, l + 3); //переход к левому поддереву for (var i = 0; i < l; i++) { Console.Write(" "); } Console.WriteLine(p.Data); ShowTree(p.Left, l + 3); //переход к правому поддереву } }
//Преобразование идеального дерева в дерево поиска private static PointTree CreateSortTree(PointTree root, PointTree sortTree) { if (root != null) { CreateSortTree(root.Left, sortTree); if (root.Data != " ") { sortTree = Add(sortTree, root.Data); } CreateSortTree(root.Right, sortTree); } return(sortTree); }
//Добавление элемента к дереву private static PointTree Add(PointTree root, string d) { var p = root; //корень дерева PointTree r = null; //флаг для проверки существования элемента d в дереве var ok = false; while (p != null && !ok) { r = p; if (d.CompareTo(p.Data) == 0) { ok = true; //элемент уже существует } else if (d.CompareTo(p.Data) == -1) { p = p.Left; //пойти в левое поддерево } else { p = p.Right; //пойти в правое поддерево } } if (ok) { return(root); //найдено, не добавляем } //создаем узел var newPoint = new PointTree(d); //выделили память // если d<r->key, то добавляем его в левое поддерево if (d.CompareTo(r.Data) == -1) { r.Left = newPoint; } // если d>r->key, то добавляем его в правое поддерево else { r.Right = newPoint; } return(root); }
//построение идеально сбалансированного дерева с клавиатуры private static PointTree IdealTree(int size, PointTree p) { PointTree r; int nl, nr; if (size == 0) { p = null; return(p); } nl = size / 2; nr = size - nl - 1; Console.WriteLine("Read string Tree element: "); var d = Console.ReadLine(); r = new PointTree(d); r.Left = IdealTree(nl, r.Left); r.Right = IdealTree(nr, r.Right); p = r; return(p); }
public PointTree(string d) { Data = d; Left = null; Right = null; }
Right; //адрес правого поддерева public PointTree() { Data = ""; Left = null; Right = null; }
//Задание 3.Найти кол-во листьев в дереве #region taskThree //Функция объединения private static void NumberLeaves() { var exit = false; var root = new PointTree(); var rootSorttree = new PointTree(); int sizeTree; var k = 3; while (!exit) { var sw = Print.Menu(k, Index[15], Index[16], Index[17], Index[14], Index[3]); switch (sw) { case 1: Console.WriteLine("Read size of ideal tree: "); sizeTree = ReadLib.ReadLib.ReadVGran(0); if (sizeTree == 0) { Console.WriteLine("Error! The tree is empty"); } else { root = IdealTree(sizeTree, root); k = 0; } Console.WriteLine(Index[8]); Console.ReadLine(); break; case 2: var count = 0; LeavesCount(root, ref count); Console.WriteLine("Number of leaves:" + count); Console.WriteLine(Index[8]); Console.ReadLine(); break; case 3: root = CreateSortTree(root, rootSorttree); ShowTree(root, 3); Console.WriteLine(Index[8]); Console.ReadLine(); break; case 4: ShowTree(root, 3); Console.WriteLine(Index[8]); Console.ReadLine(); break; case 5: exit = true; break; } } }