public void Run(PointTree <Trial> t) { if (t != null) { Run(t.left); //переход к левому поддереву Run(t.right); //переход к правому поддереву } }
public int TreeDeep(PointTree <Trial> root) { if (root == null) { return(0); } else { return(1 + Math.Max(TreeDeep(root.left), TreeDeep(root.right))); } }
public static void BinaryTreeMenu() { PointTree <Trial> root = new PointTree <Trial>(new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Tree <Trial> tr = new Tree <Trial>(root); root = tr.IdealTree(15, root, rnd); int choice = -1; while (choice != 5) { Console.WriteLine("1. Печать"); Console.WriteLine("2. Найти высоту дерева"); Console.WriteLine("3. Преобразовать в дерево поиска"); Console.WriteLine("4. Удалить из памяти"); Console.WriteLine("5. Назад"); bool ok = int.TryParse(Console.ReadLine(), out choice); if (!ok) { do { Console.WriteLine("Проверьте правильность ввода"); ok = int.TryParse(Console.ReadLine(), out choice); } while (!ok || choice < 0 || choice > 5); } switch (choice) { case 1: tr.ShowTree(root, 3); break; case 2: Console.WriteLine("Высота дерева = " + tr.TreeDeep(root)); break; case 3: PointTree <Trial> searchTree = tr.first(root.Data); tr.MakeSearch(root, searchTree); root = searchTree; tr.ShowTree(root, 3); break; case 4: tr = null; Console.WriteLine("Удаление выполнено"); break; case 5: choice = 5; Console.Clear(); break; } } }
/*рекурсивная функция для печати дерева по уровням с обходом слева направо*/ public void ShowTree(PointTree <Trial> p, int l) { if (p != null) { ShowTree(p.left, l + 5); //переход к левому поддереву //формирование отступа for (int i = 0; i < l; i++) { Console.Write(" "); } Console.WriteLine(p.Data); //печать узла ShowTree(p.right, l + 5); //переход к правому поддереву } }
public PointTree <Trial> MakeFirstTree() { Random rnd = new Random(); PointTree <Trial> root = first(new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); Add(root, new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); return(root); }
//добавление элемента d в дерево поиска public PointTree <Trial> Add(PointTree <Trial> root, Trial trial) { PointTree <Trial> p = root; //корень дерева PointTree <Trial> r = null; //флаг для проверки существования элемента d в дереве bool ok = false; while (p != null && !ok) { r = p; //элемент уже существует if (trial == p.Data) { ok = true; } else if (trial.Mark < p.Data.Mark) { p = p.left; //пойти в левое поддерево } else { p = p.right; //пойти в правое поддерево } } if (ok) { return(p); //найдено, не добавляем } //создаем узел PointTree <Trial> NewPoint = new PointTree <Trial>(trial);//выделили память // если d<r.key, то добавляем его в левое поддерево if (trial.Mark < r.Data.Mark) { r.left = NewPoint; } // если d>r.key, то добавляем его в правое поддерево else { r.right = NewPoint; } return(NewPoint); }
//построение идеально сбалансированного дерева public PointTree <Trial> IdealTree(int size, PointTree <Trial> root, Random rnd) { PointTree <Trial> r; int nl, nr; if (size == 0) { root = null; return(root); } nl = size / 2; nr = size - nl - 1; r = new PointTree <Trial>(new Trial(rnd.Next(1, 30), rnd.Next(1, 12), rnd.Next(0, 10))); for (int i = 0; i < size; i++) { r.left = IdealTree(nl, r.left, rnd); r.right = IdealTree(nr, r.right, rnd); } return(r); }
public PointTree <Trial> first(Trial tr) { PointTree <Trial> t = new PointTree <Trial>(tr); return(t); }
public Tree(PointTree <Trial> t) { Root = t; }
public Tree() { Root = null; }
public PointTree(Trial t) { Data = t; left = null; right = null; }
right; //адрес правого поддерева public PointTree() { Data = null; left = null; right = null; }