static void Main(string[] args) { var tree = new BinaryTree(); int exit = 0; Console.WriteLine("Программа Б-Дерево"); Console.WriteLine("Выполнил Айгозин Ильяс. ПИ-922"); Console.WriteLine("Нажмите любую клавишу для продолжения...\n"); Console.ReadKey(); while (exit != 1) { Console.WriteLine("Меню программы"); Console.WriteLine("1.Добавить значение в дерево"); Console.WriteLine("2.Удалить значение"); Console.WriteLine("3.Поиск значения"); Console.WriteLine("4.Вывод с прямым обходом"); Console.WriteLine("5.Вывод с симметричным обходом"); Console.WriteLine("6.Вывод с обратным обходом"); Console.WriteLine("7.Выход"); Console.Write("\nВведите ваше значение: "); int menu = Convert.ToInt32(Console.ReadLine()); string space = ""; switch (menu) { case 1: Console.Write("\nКакое значение ввести: "); tree.Insert(Convert.ToInt32(Console.ReadLine())); break; case 2: Console.Write("\nКакое значение удалить: "); tree.Remove(Convert.ToInt32(Console.ReadLine())); break; case 3: Console.WriteLine("\nКакой элемент нужно найти: "); BinaryTreeExtensions.SearchPrint(tree, Convert.ToInt32(Console.ReadLine())); break; case 4: Console.WriteLine("\nПрямой обход:"); BinaryTreeExtensions.PreOrderPrint(tree, space); break; case 5: Console.WriteLine("\nСимметричный обход:"); BinaryTreeExtensions.InOrderPrint(tree, space); break; case 6: Console.WriteLine("\nОбратный обход:"); BinaryTreeExtensions.PostOrderPrint(tree, space); break; case 7: exit = 1; break; } Console.WriteLine("\n\nДля продолжения нажмите любую клавишу..."); Console.ReadKey(); Console.Clear(); } }
public void Remove(BinaryTree node) { if (node == null) { return; } var me = ForParent(node); //Если у узла нет дочерних элементов, его можно смело удалять if (node.Left == null && node.Right == null) { if (me == BinSide.Left) { node.Parent.Left = null; } else { node.Parent.Right = null; } return; } //Если нет левого дочернего, то правый дочерний становится на место удаляемого if (node.Left == null) { if (me == BinSide.Left) { node.Parent.Left = node.Right; } else { node.Parent.Right = node.Right; } node.Right.Parent = node.Parent; return; } //Если нет правого дочернего, то левый дочерний становится на место удаляемого if (node.Right == null) { if (me == BinSide.Left) { node.Parent.Left = node.Left; } else { node.Parent.Right = node.Left; } node.Left.Parent = node.Parent; return; } //Если присутствуют оба дочерних узла //то правый ставим на место удаляемого //а левый вставляем в правый if (me == BinSide.Left) { node.Parent.Left = node.Right; } if (me == BinSide.Right) { node.Parent.Right = node.Right; } if (me == null) { var bufLeft = node.Left; var bufRightLeft = node.Right.Left; var bufRightRight = node.Right.Right; node.Data = node.Right.Data; node.Right = bufRightRight; node.Left = bufRightLeft; Insert(bufLeft, node, node); } else { node.Right.Parent = node.Parent; Insert(node.Left, node.Right, node.Right); } }