Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        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);
            }
        }