예제 #1
0
        public bool Delete(T value)
        {
            //Проверяем, существует ли данный узел
            BinaryTree <T> tree = Search(value);

            if (tree == null)
            {
                return(false);              //Если узла не существует, вернем false
            }
            BinaryTree <T> currentNode;

            //Если удаляем корень
            if (tree == this)
            {
                if (tree.right != null)
                {
                    currentNode = tree.right;
                }
                else
                {
                    currentNode = tree.left;
                }
                while (currentNode.left != null)
                {
                    currentNode = currentNode.left;
                }
                T temp = currentNode.value;
                this.Delete(temp);
                tree.value = temp;
                return(true);
            }

            //Удаление листьев
            if (tree.left == null && tree.right == null && tree.root != null)
            {
                if (tree == tree.root.left)
                {
                    tree.root.left = null;
                }
                else
                {
                    tree.root.right = null;
                }
                return(true);
            }
            //Удаление узла, имеющего левое поддерево, но не имеющее правого поддерева
            if (tree.left != null && tree.right == null)
            {
                //Меняем родителя
                tree.left.root = tree.root;
                if (tree == tree.root.left)
                {
                    tree.root.left = tree.left;
                }
                else if (tree == tree.root.right)
                {
                    tree.root.right = tree.left;
                }
                return(true);
            }

            //Удаление узла, имеющего правое поддерево, но не имеющее левого поддерева
            if (tree.left == null && tree.right != null)
            {
                //Меняем родителя
                tree.right.root = tree.root;
                if (tree == tree.root.left)
                {
                    tree.root.left = tree.right;
                }
                else
                {
                    tree.root.right = tree.right;
                }
                return(true);
            }

            //Удаляем узел, имеющий поддеревья с обеих сторон
            if (tree.right != null && tree.left != null)
            {
                currentNode = tree.right;
                while (currentNode.left != null)
                {
                    currentNode = currentNode.left;
                }
                //Если самый левый элемент является первым потомком
                if (currentNode.root == tree)
                {
                    currentNode.left = tree.left;
                    tree.left.root   = currentNode;
                    currentNode.root = tree.root;
                    if (tree == tree.root.left)
                    {
                        tree.root.left = currentNode;
                    }
                    else
                    {
                        tree.root.right = currentNode;
                    }
                    return(true);
                }
                //Если самый левый элемент НЕ является первым потомком
                else
                {
                    if (currentNode.right != null)
                    {
                        currentNode.right.root = currentNode.root;
                    }
                    currentNode.root.left = currentNode.right;
                    currentNode.right     = tree.right;
                    currentNode.left      = tree.left;
                    tree.left.root        = currentNode;
                    tree.right.root       = currentNode;
                    currentNode.root      = tree.root;
                    if (tree == tree.root.left)
                    {
                        tree.root.left = currentNode;
                    }
                    else
                    {
                        tree.root.right = currentNode;
                    }
                    return(true);
                }
            }
            return(false);
        }
예제 #2
0
 public BinaryTree(T value, BinaryTree <T> root)
 {
     this.value = value;
     this.root  = root;
 }