예제 #1
0
        //Левый сын, правый брат (таблица, массив)
        public static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            int n = int.TryParse(Console.ReadLine(), out int temp) ? temp : 10;

            Console.WriteLine($"N = {n}");

            MyTree myTree  = new MyTree(n);
            Random random  = new Random();
            var    numbers = Enumerable.Range(1, n).OrderBy(i => random.Next()).ToArray();

            foreach (var number in numbers)
            {
                myTree.AddRandom(number);
            }

            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("Дерево А");
            Console.ForegroundColor = ConsoleColor.Gray;
            TreePrinter.PrintMyTree(myTree);

            Console.ForegroundColor = ConsoleColor.DarkMagenta;
            PreOrder(myTree);
            InOrder(myTree);
            Console.ForegroundColor = ConsoleColor.Gray;

            MyTree deleteTree = new MyTree(n / 2);

            numbers = numbers.OrderBy(i => random.Next()).TakeWhile((_, idx) => idx < numbers.Length / 2).ToArray();
            foreach (var number in numbers)
            {
                deleteTree.AddRandom(number);
            }

            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("Дерево B");
            Console.ForegroundColor = ConsoleColor.Gray;
            TreePrinter.PrintMyTree(deleteTree);

            Console.ForegroundColor = ConsoleColor.DarkMagenta;
            PreOrder(deleteTree);
            InOrder(deleteTree);
            Console.ForegroundColor = ConsoleColor.Gray;

            myTree.Deletion(deleteTree);
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("А = A ⋂ B");
            Console.ForegroundColor = ConsoleColor.Gray;
            TreePrinter.PrintMyTree(myTree);
            Console.ForegroundColor = ConsoleColor.DarkMagenta;
            PreOrder(myTree);
            InOrder(myTree);
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.ReadLine();
        }
예제 #2
0
        public static void PrintMyTree(MyTree myTree, int topMargin = 0, int leftMargin = 2)
        {
            BNode firstNode = new BNode(0);

            // Console.WriteLine($"Top = {myTree.topIdx}");
            // for (int i = 0; i <= myTree.treeSize; i++)
            // {
            //     Console.WriteLine($"{i,2}) {myTree.table[i, 0],2} {myTree.table[i, 1],2} {myTree.table[i, 2],2}");
            // }

            Add(firstNode, myTree.TopIdx);

            TreePrinter.Print(firstNode, topMargin, leftMargin);

            void Add(BNode node, int index)
            {
                if (myTree.Table[index, 1] != 0)
                {
                    node.Item = myTree.Table[index, 1];
                    // если есть сын
                    if (myTree.Table[index, 0] != 0)
                    {
                        int childIdx = myTree.Table[index, 0];
                        // если сын меньше ключа
                        if (myTree.Table[childIdx, 1] < node.Item)
                        {
                            node.Left = new BNode(0);
                            Add(node.Left, childIdx);
                            int broIdx = myTree.Table[childIdx, 2];
                            // если у сына есть брат
                            if (broIdx != 0)
                            {
                                node.Right = new BNode(0);
                                Add(node.Right, broIdx);
                            }
                        }
                        // если сын больше ключа (значит сын у нас один)
                        else
                        {
                            node.Right = new BNode(0);
                            Add(node.Right, childIdx);
                        }
                    }
                }
                // else
                // {
                //     firstNode = null;
                // }
            }
        }