Beispiel #1
0
        public bool remove(int val)
        {
            //Проверяем, существует ли данный узел
            BinaryTree tree = search(this, val);

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

            //Если удаляем корень
            if (tree == this)
            {
                if (tree.right != null)
                {
                    curTree = tree.right;
                }
                else
                {
                    curTree = tree.left;
                }

                while (curTree.left != null)
                {
                    curTree = curTree.left;
                }
                int temp = curTree.val;
                this.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);
        }
Beispiel #2
0
 public BinaryTree(int val, BinaryTree parent)
 {
     this.val    = val;
     this.parent = parent;
 }