public BinaryTree(T val, BinaryTree <T> parent) { Val = val; Parent = parent; }
public void Execute() { Console.WriteLine($"{this.GetType().FullName}\n"); BinaryTree <int> binaryTree = null; var key = string.Empty; ShowMenu(); while (key != "-q") { key = Console.ReadLine(); switch (key) { case "1": Console.WriteLine("Введите корневой элемент:\t"); var val = Console.ReadLine(); binaryTree = new BinaryTree <int>(Convert.ToInt32(val), null); break; case "2": Console.WriteLine("Введите элемент:\t"); val = Console.ReadLine(); binaryTree.Add(Convert.ToInt32(val)); break; case "3": Console.WriteLine("Введите ключ для поиска:\t"); val = Console.ReadLine(); var searchResult = binaryTree.Search(Convert.ToInt32(val)); searchResult.ToString(); break; case "4": Console.WriteLine("Введите ключ для удаления:\t"); val = Console.ReadLine(); var result = binaryTree.Remove(Convert.ToInt32(val)); if (result) { Console.WriteLine("Элемент удален успешно!"); } else { Console.WriteLine("Элемент не удален успешно"); } break; case "5": binaryTree.PrintTree(); break; case "6": var startC = 0; var resOfC = binaryTree.Count(ref startC); Console.WriteLine($"Содержит {resOfC} узлов имеющих двух потомков, включая корень"); break; case "-d": binaryTree = new BinaryTree <int>(8, null); binaryTree.Add(3); binaryTree.Add(10); binaryTree.Add(1); binaryTree.Add(6); binaryTree.Add(4); binaryTree.Add(7); binaryTree.Add(14); binaryTree.Add(16); break; case "-h": case "help": ShowMenu(); break; default: break; } Console.WriteLine("Введите команду:"); } Console.ReadKey(); }
public bool Remove(T val) { //Проверяем, существует ли данный узел BinaryTree <T> tree = Search(val); if (tree == null) { return(false); } BinaryTree <T> curTree; //Если удаляем корень if (tree == this) { if (tree.Right != null) { curTree = tree.Right; } else { curTree = tree.Left; } while (curTree.Left != null) { curTree = curTree.Left; } T temp = curTree.Val; Remove(temp); tree.Val = temp; return(true); } //Удаление листьев if (tree.Left == null && tree.Right == null && tree.Parent != null) { if (tree == tree.Parent.Left) { tree.Parent.Left = null; } else { tree.Parent.Right = null; } return(true); } //Удаление узла, имеющего левое поддерево, но не имеющее правого поддерева if (tree.Left != null && tree.Right == null) { //Меняем родителя tree.Left.Parent = tree.Parent; if (tree == tree.Parent.Left) { tree.Parent.Left = tree.Left; } else if (tree == tree.Parent.Right) { tree.Parent.Right = tree.Left; } return(true); } //Удаление узла, имеющего правое поддерево, но не имеющее левого поддерева if (tree.Left == null && tree.Right != null) { tree.Right.Parent = tree.Parent; if (tree == tree.Parent.Left) { tree.Parent.Left = tree.Right; } else if (tree == tree.Parent.Right) { tree.Parent.Right = tree.Right; } return(true); } //Удаляем узел, имеющий поддеревья с обеих сторон if (tree.Right != null && tree.Left != null) { curTree = tree.Right; while (curTree.Left != null) { curTree = curTree.Left; } //Если самый левый элемент является первым потомком if (curTree.Parent == tree) { curTree.Left = tree.Left; tree.Left.Parent = curTree; curTree.Parent = tree.Parent; if (tree == tree.Parent.Left) { tree.Parent.Left = curTree; } else if (tree == tree.Parent.Right) { tree.Parent.Right = curTree; } return(true); } //Если самый левый элемент НЕ является первым потомком else { if (curTree.Right != null) { curTree.Right.Parent = curTree.Parent; } curTree.Parent.Left = curTree.Right; curTree.Right = tree.Right; curTree.Left = tree.Left; tree.Left.Parent = curTree; tree.Right.Parent = curTree; curTree.Parent = tree.Parent; if (tree == tree.Parent.Left) { tree.Parent.Left = curTree; } else if (tree == tree.Parent.Right) { tree.Parent.Right = curTree; } return(true); } } return(false); }