public TreeString(string value) { this.value = value; parent = null; left = null; right = null; }
private static void CountCompare(TreeString tree) { Console.WriteLine( "Введите символ для поиска:"); string charToSearch = Console.ReadKey().KeyChar.ToString(); int counter = 0; Count(tree); Console.WriteLine($"\nКоличество элементов начинающихся с заданного символа = {counter}"); void Count(TreeString _tree) { if (_tree.Value.StartsWith(charToSearch)) { counter++; } if (_tree.Left != null) { Count(_tree.Left); } if (_tree.Right != null) { Count(_tree.Right); } } }
private TreeString(TreeString parent, string value) { this.value = value; this.parent = parent; left = null; right = null; }
/// <summary> /// Создание идеального дереваб не упорядоченного /// </summary> /// <param name="values">массив строк для добавления</param> /// <returns></returns> public static TreeString IdealTree(params string[] values) { if (values.Length == 0) { return(null); } int sizeLeft = values.Length / 2; int sizeRight = values.Length - sizeLeft - 1; TreeString currentKnot = new TreeString(values[0]); if (sizeLeft > 0) { string[] leftArray = new string[sizeLeft]; Array.Copy(values, 1, leftArray, 0, sizeLeft); currentKnot.left = IdealTree(leftArray); currentKnot.left.parent = currentKnot; } if (sizeRight > 0) { string[] rightArray = new string[sizeRight]; Array.Copy(values, sizeLeft + 1, rightArray, 0, sizeRight); currentKnot.right = IdealTree(rightArray); currentKnot.right.parent = currentKnot; } return(currentKnot); }
public TreeString() { value = null; parent = null; left = null; right = null; }
public static void ShowMenu() { Console.WriteLine("\nРабота со списками и деревьями"); var tree = new TreeString(); string operations = "Выберите меню:" + "\n\t1 Меню работы со списками" + "\n\t2 Меню работы с двусвязными списками" + "\n\t3 Меню работы с деревьями"; int number = -1; while (number != 0) { Console.WriteLine(operations); number = Menu.GetInt("Введите номер операции. Для выхода введите 0, " + "для повтора меню 11", min: -1, max: 5); switch (number) { case 0: break; case 1: LinkedListDoubleMenu.Show(); break; case 2: BiLinkedListIntMenu.Show(); break; case 3: TreeStringMenu.Show(); break; } } }
private static TreeString GetTreeFromString() { var words = GetWords("Введите строку из слов").Distinct(); TreeString tree = new TreeString(); foreach (var word in words) { tree.Add(word); } return(tree); }
private static TreeString GetIdealTreeFromString() { var tempArray = GetWords("Введите строку из слов").Distinct(); string[] words = new string[tempArray.Count()]; if (words.Length == 0) { return(new TreeString()); } int index = 0; foreach (var word in tempArray) { words[index++] = word.ToString(); } return(TreeString.IdealTree(words)); }
/// <summary> /// Рекурсивное создание элементов принтера /// </summary> /// <param name="tree">Элемент дерева</param> /// <param name="parent">Предок создаваемого элемента</param> /// <param name="level">Уровень создаваемого элемента</param> public PrinterNode(TreeString tree, PrinterNode parent = null, int level = 0) { if (parent != null) { Parent = parent; } this.level = level; Text = tree.Value; if (tree.HasLeft) { this.Left = new PrinterNode(tree.Left, this, level + 1); } if (tree.HasRight) { this.Right = new PrinterNode(tree.Right, this, level + 1); } StartPosition = -1; }
/// <summary> /// Добавление нового элемента с заданным значением(упорядоченное) /// </summary> /// <param name="newValue">значение для добавления</param> /// <returns>возвращает новый элемент илм существующий(если значение имеется в дереве)</returns> public TreeString Add(string newValue) { if (IsEmpty) { this.value = newValue; return(this); } bool isFind = false; TreeString currentKnot = this; TreeString previousKnot = this.Parent; while (currentKnot != null && !isFind) { previousKnot = currentKnot; if (newValue == currentKnot.Value) { isFind = true; } else if (currentKnot.Value.CompareTo(newValue) > 0) { currentKnot = currentKnot.Left; } else { currentKnot = currentKnot.Right; } } if (isFind) { return(currentKnot); } if (previousKnot.Value.CompareTo(newValue) > 0) { return(previousKnot.AddLeft(newValue)); } else { return(previousKnot.AddRight(newValue)); } }
public static void Show() { Console.WriteLine("\nРабота с деревьями"); var tree = new TreeString(); string operations = "Операции с деревьями:" + "\n\t1 Создать пустое дерево" + "\n\t2 Создать дерево с заданым значением" + "\n\t3 Вывести дерево в консоль боком" + "\n\t4 Добавить элемент в дерево (упорядочено)" + "\n\t5 Подсчет количества элементов начинающихся с заданного символа" + "\n\t6 Вывести количество элементов в дереве" + "\n\t7 Вывести количество уровней в дереве" + "\n\t8 Создать дерево из слов из заданой строки (упорядочено)" + "\n\t9 Создать идеальное дерево из слов из заданой строки(не упорядоченно)" + "\n\t10 Вывести дерево сверху вниз (красиво)" + "\n\t11 Повтор меню"; Console.WriteLine(operations); int number = -1; while (number != 0) { number = GetInt("Введите номер операции. Для выхода введите 0, " + "для повтора меню 11", min: -1, max: 12); switch (number) { case 0: break; case 1: tree = new TreeString(); break; case 2: Console.Write("\tВведите строку для добавления в дерево:\n\t"); tree = new TreeString(Console.ReadLine()); tree.Show(); break; case 3: tree.Show(); break; case 4: Console.Write("\tВведите строку для добавления в дерево:\n\t"); tree.Add(Console.ReadLine()); tree.Show(); break; case 5: CountCompare(tree); break; case 6: Console.WriteLine($"Количество элементов в дереве {tree.Count}"); break; case 7: Console.WriteLine($"Количество уровней в дереве {tree.Levels}");; break; case 8: tree = GetTreeFromString(); tree.Show(); break; case 9: tree = GetIdealTreeFromString(); tree.Show(); break; case 10: var printer = new TreePrinter(tree); printer.Print(); break; case 11: Console.WriteLine(operations); break; } } }
/// <summary> /// Создание левого элемента с заданным значением /// </summary> /// <param name="value">значение для добавления</param> /// <returns></returns> private TreeString AddLeft(string value) { left = new TreeString(this, value); return(Left); }
/// <summary> /// Добавление дерева в качестве правого элемента /// </summary> /// <param name="tree">дерево для добавления</param> private void AddRight(TreeString tree) { right = tree; right.parent = this; }
/// <summary> /// Добавление дерева в качестве левого элемента /// </summary> /// <param name="tree">дерево для добавления</param> private void AddLeft(TreeString tree) { left = tree; left.parent = this; }
/// <summary> /// Создание правого элемента с заданным значением /// </summary> /// <param name="value">значение для добавления</param> /// <returns></returns> private TreeString AddRight(string value) { right = new TreeString(this, value); return(Right); }
public TreePrinter(TreeString tree) { root = new PrinterNode(tree); }