Exemple #1
0
 public BinaryTree(T val, BinaryTree <T> parent)
 {
     Val    = val;
     Parent = parent;
 }
Exemple #2
0
        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();
        }
Exemple #3
0
        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);
        }