Exemplo n.º 1
0
        public void TakeElementFromNextRightSibling(TreeNode p, TreeNode node, int n)
        {
            node.elements[0] = p.elements[n];
            p.elements[n]    = p.children[n + 1].elements[0];

            if (this.limit == 2)
            {
                p.children[n + 1].elements[0] = p.children[n + 1].elements[1];
                p.children[n + 1].elements[1] = 0;
            }
            else
            {
                p.children[n + 1].elements[0] = p.children[n + 1].elements[1];
                p.children[n + 1].elements[1] = p.children[n + 1].elements[2];
                p.children[n + 1].elements[2] = 0;
            }

            if (node.IsLeaf() == false)
            {
                node.children[1] = p.children[n + 1].children[0];

                if (this.limit == 2)
                {
                    p.children[n + 1].children[0] = p.children[n + 1].children[1];
                    p.children[n + 1].children[1] = p.children[n + 1].children[2];
                    p.children[n + 1].children[2] = null;
                }

                else
                {
                    p.children[n + 1].children[0] = p.children[n + 1].children[1];
                    p.children[n + 1].children[1] = p.children[n + 1].children[2];
                    p.children[n + 1].children[2] = p.children[n + 1].children[3];
                    p.children[n + 1].children[3] = null;
                }

                node.children[1].parent = node;
            }
        }
Exemplo n.º 2
0
        public override void Split(TreeNode twoFourNode, int element)
        {
            TwoFourTreeNode p;
            twoFourNode = (TwoFourTreeNode) twoFourNode;

            if (twoFourNode.parent == null)
            {
                p = new TwoFourTreeNode();
            }
            else
            {
                p = (TwoFourTreeNode) twoFourNode.parent;
            }

            TwoFourTreeNode n1 = new TwoFourTreeNode();
            TwoFourTreeNode n2 = new TwoFourTreeNode();

            int[] elements = { element, twoFourNode.elements[0], twoFourNode.elements[1], twoFourNode.elements[2] };
            int middle;
            this.SortElements(elements, elements.Length);

            n1.elements[0] = elements[0];
            n1.elements[1] = elements[1];
            n2.elements[0] = elements[3];
            middle = elements[2];
            n1.parent = p;
            n2.parent = p;

            if (p.NumberOfElements() == 0)
            {
                p.children[0] = n1;
                p.children[1] = n2;
                this.root = p;
            }

            else if (p.NumberOfElements() == 1)
            {
                if (n2.elements[0] < p.elements[0])
                {
                    p.children[2] = p.children[1];
                    p.children[0] = n1;
                    p.children[1] = n2;
                }
                else
                {
                    p.children[1] = n1;
                    p.children[2] = n2;
                }
            }
            else if (p.NumberOfElements() == 2)
            {
                if (n2.elements[0] < p.elements[0] && n2.elements[0] < p.elements[1])
                {
                    p.children[3] = p.children[2];
                    p.children[2] = p.children[1];
                    p.children[0] = n1;
                    p.children[1] = n2;
                }
                else if (n1.elements[1] > p.elements[0] && n1.elements[1] > p.elements[1])
                {
                    p.children[2] = n1;
                    p.children[3] = n2;
                }
                else
                {
                    p.children[3] = p.children[2];
                    p.children[1] = n1;
                    p.children[2] = n2;
                }
            }
            else if (p.NumberOfElements() == 3)
            {
                if (n2.elements[0] < p.elements[0])
                {
                    p.children[4] = p.children[3];
                    p.children[3] = p.children[2];
                    p.children[2] = p.children[1];
                    p.children[1] = n2;
                    p.children[0] = n1;
                }

                else if (n1.elements[0] > p.elements[0] && n2.elements[0] < p.elements[1])
                {
                    p.children[4] = p.children[3];
                    p.children[3] = p.children[2];
                    p.children[2] = n2;
                    p.children[1] = n1;
                }

                else if (n1.elements[0] > p.elements[1] && n2.elements[0] < p.elements[2])
                {
                    p.children[4] = p.children[3];
                    p.children[3] = n2;
                    p.children[2] = n1;
                }
                else
                {
                    p.children[3] = n1;
                    p.children[4] = n2;
                }
            }

            //if it is not a leaf check
            if (twoFourNode.IsLeaf() == false)
            {
                twoFourNode.children[0].parent = n1;
                twoFourNode.children[1].parent = n1;
                twoFourNode.children[2].parent = n1;

                twoFourNode.children[3].parent = n2;
                twoFourNode.children[4].parent = n2;

                n1.children[0] = twoFourNode.children[0];
                n1.children[1] = twoFourNode.children[1];
                n1.children[2] = twoFourNode.children[2];

                n2.children[0] = twoFourNode.children[3];
                n2.children[1] = twoFourNode.children[4];
            }

            if (p.NumberOfElements() == 3)
            {
                this.Split(p, middle);
            }

            else if (p.NumberOfElements() < this.limit)
            {
                p.elements[p.NumberOfElements()] = middle;

                this.SortElements(p.elements, p.NumberOfElements());
            }
        }
Exemplo n.º 3
0
        public void TakeElementFromTwoNextRightSibling(TreeNode p, TreeNode node, int n)
        {
            node.elements[0] = p.elements[n];
            p.elements[n] = p.children[n + 1].elements[0];
            p.children[n + 1].elements[0] = p.elements[n + 1];
            p.elements[n + 1] = p.children[n + 2].elements[0];

            if (p.children[n + 2].NumberOfElements() == 2)
            {
                p.children[n + 2].elements[0] = p.children[n + 2].elements[1];
                p.children[n + 2].elements[1] = 0;
            }

            else if (p.children[n + 2].NumberOfElements() == 3)
            {
                p.children[n + 2].elements[0] = p.children[n + 2].elements[1];
                p.children[n + 2].elements[1] = p.children[n + 2].elements[2];
                p.children[n + 2].elements[2] = 0;
            }

            if (node.IsLeaf() == false)
            {
                node.children[1] = p.children[n + 1].children[0];
                p.children[n + 1].children[0] = p.children[n + 1].children[1];
                p.children[n + 1].children[1] = p.children[n + 2].children[0];

                if (p.children[n + 2].NumberOfElements() == 1)
                {
                    p.children[n + 2].children[0] = p.children[n + 2].children[1];
                    p.children[n + 2].children[1] = p.children[n + 2].children[2];
                    p.children[n + 2].children[2] = null;
                }
                else if (p.children[n + 2].NumberOfElements() == 2)
                {
                    p.children[n + 2].children[0] = p.children[n + 2].children[1];
                    p.children[n + 2].children[1] = p.children[n + 2].children[2];
                    p.children[n + 2].children[2] = p.children[n + 2].children[3];
                    p.children[n + 2].children[3] = null;
                }

                node.children[1].parent = node;
                p.children[n + 1].children[1].parent = p.children[n + 1];
            }
        }
Exemplo n.º 4
0
        public void TakeElementFromNextRightSibling(TreeNode p, TreeNode node, int n)
        {
            node.elements[0] = p.elements[n];
            p.elements[n] = p.children[n + 1].elements[0];

            if (this.limit == 2)
            {
                p.children[n + 1].elements[0] = p.children[n + 1].elements[1];
                p.children[n + 1].elements[1] = 0;
            }
            else
            {

                p.children[n + 1].elements[0] = p.children[n + 1].elements[1];
                p.children[n + 1].elements[1] = p.children[n + 1].elements[2];
                p.children[n + 1].elements[2] = 0;
            }

            if (node.IsLeaf() == false)
            {
                node.children[1] = p.children[n + 1].children[0];

                if (this.limit == 2)
                {
                    p.children[n + 1].children[0] = p.children[n + 1].children[1];
                    p.children[n + 1].children[1] = p.children[n + 1].children[2];
                    p.children[n + 1].children[2] = null;
                }

                else
                {

                    p.children[n + 1].children[0] = p.children[n + 1].children[1];
                    p.children[n + 1].children[1] = p.children[n + 1].children[2];
                    p.children[n + 1].children[2] = p.children[n + 1].children[3];
                    p.children[n + 1].children[3] = null;
                }

                node.children[1].parent = node;
            }
        }
Exemplo n.º 5
0
        public void Merge(TreeNode node)
        {
            if (node.parent.NumberOfElements() == 1)
            {
                //empty node at the left
                if (node.parent.children[0] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.children[1].elements[0];
                    node.parent.children[1].elements[0] = node.parent.elements[0];
                    node.parent.elements[0] = 0;

                    //remove the node
                    node.parent.children[0] = node.parent.children[1];
                    node.parent.children[1] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.parent.children[0].children[1];
                        node.parent.children[0].children[1] = node.parent.children[0].children[0];
                        node.parent.children[0].children[0] = node.children[0];
                        //update the parent
                        node.parent.children[0].children[0].parent = node.parent.children[0];
                    }
                }
                //empty node at the right
                else
                {
                    node.parent.children[0].elements[1] = node.parent.elements[0];
                    node.parent.elements[0] = 0;

                    node.parent.children[1] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.children[0];
                        node.parent.children[0].children[2].parent = node.parent.children[0];
                    }
                }
            }
            else if (node.parent.NumberOfElements() == 2)
            {
                //empty node at the left
                if (node.parent.children[0] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.children[1].elements[0];
                    node.parent.children[1].elements[0] = node.parent.elements[0];
                    node.parent.elements[0] = node.parent.elements[1];
                    node.parent.elements[1] = 0;

                    node.parent.children[0] = node.parent.children[1];
                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.parent.children[0].children[1];
                        node.parent.children[0].children[1] = node.parent.children[0].children[0];
                        node.parent.children[0].children[0] = node.children[0];

                        node.parent.children[0].children[0].parent = node.parent.children[0];
                    }

                }

                //empty node at the middle
                else if (node.parent.children[1] == node)
                {
                    node.parent.children[0].elements[1] = node.parent.elements[0];
                    node.parent.elements[0] = node.parent.elements[1];
                    node.parent.elements[1] = 0;

                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.children[0];
                        node.parent.children[0].children[2].parent = node.parent.children[0];
                    }
                }

                //empty node at the right
                else
                {
                    node.parent.children[1].elements[1] = node.parent.elements[1];
                    node.parent.elements[1] = 0;

                    node.parent.children[2] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[1].children[2] = node.children[0];
                        node.parent.children[1].children[2].parent = node.parent.children[1];
                    }
                }
            }
            else if (node.parent.NumberOfElements() == 3)
            {
                if (node.parent.children[0] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.children[1].elements[0];
                    node.parent.children[1].elements[0] = node.parent.elements[0];
                    node.parent.elements[0] = node.parent.elements[1];
                    node.parent.elements[1] = node.parent.elements[2];
                    node.parent.elements[2] = 0;

                    node.parent.children[0] = node.parent.children[1];
                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = node.parent.children[3];
                    node.parent.children[3] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.parent.children[0].children[1];
                        node.parent.children[0].children[1] = node.parent.children[0].children[0];
                        node.parent.children[0].children[0] = node.children[0];

                        node.parent.children[0].children[0].parent = node.parent.children[0];
                    }
                }
                else if (node.parent.children[1] == node)
                {
                    node.parent.children[0].elements[1] = node.parent.elements[0];
                    node.parent.elements[0] = node.parent.elements[1];
                    node.parent.elements[1] = node.parent.elements[2];
                    node.parent.elements[2] = 0;

                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = node.parent.children[3];
                    node.parent.children[3] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.children[0];
                        node.parent.children[0].children[2].parent = node.parent.children[0];
                    }
                }
                else if (node.parent.children[2] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.elements[1];
                    node.parent.elements[1] = node.parent.elements[2];
                    node.parent.elements[2]= 0;

                    node.parent.children[2] = node.parent.children[3];
                    node.parent.children[3] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[1].children[2] = node.children[0];
                        node.parent.children[1].children[2].parent = node.parent.children[1];
                    }
                }
                else if (node.parent.children[3] == node)
                {
                    node.parent.children[2].elements[1] = node.parent.elements[2];
                    node.parent.elements[2] = 0;

                    node.parent.children[3] = null;

                    //if node is internal
                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[2].children[2] = node.children[0];
                        node.parent.children[2].children[2].parent = node.parent.children[2];
                    }
                }
            }
        }
Exemplo n.º 6
0
        public TreeNode FindSubtreeLeaf(TreeNode node, int element)
        {
            if (node.IsLeaf())
                return node;

            else
            {
                if (element < node.elements[0])
                    return this.FindSubtreeLeaf(node.children[0], element);

                else if (node.NumberOfElements() == 1 || (element > node.elements[0] && element < node.elements[1]))
                    return this.FindSubtreeLeaf(node.children[1], element);

                else if (node.NumberOfElements() == 2 || (element > node.elements[1] && element < node.elements[2]))
                    return this.FindSubtreeLeaf(node.children[2], element);

                else
                    return this.FindSubtreeLeaf(node.children[3], element);
            }
        }
Exemplo n.º 7
0
        //Recursively split to balance the tree
        public override void Split(TreeNode twoThreeNode, int element)
        {
            TwoThreeTreeNode p;

            if (twoThreeNode.parent == null)
            {
                p = new TwoThreeTreeNode();

            }
            else
            {
                p = (TwoThreeTreeNode) twoThreeNode.parent;
            }

            TwoThreeTreeNode n1 = new TwoThreeTreeNode();
            TwoThreeTreeNode n2 = new TwoThreeTreeNode();

            //finding the smallest, middle and large elements
            int small, middle, large;

            if (element < twoThreeNode.elements[0])
            {
                small = element;
                middle = twoThreeNode.elements[0];
                large = twoThreeNode.elements[1];
            }
            else if (element > twoThreeNode.elements[1])
            {
                small = twoThreeNode.elements[0];
                middle = twoThreeNode.elements[1];
                large = element;
            }
            else
            {
                small = twoThreeNode.elements[0];
                middle = element;
                large = twoThreeNode.elements[1];
            }

            //set smallest and largest keys to the n1 and n2 respectively
            n1.elements[0] = small;
            n2.elements[0] = large;

            //Make p the parent node of n1 and n2
            n1.parent = p;
            n2.parent = p;

            if (p.NumberOfElements() == 0)
            {
                p.children[0] = n1;
                p.children[1] = n2;
                this.root = p;

                n1.isLeaf = true;
                n2.isLeaf = true;
            }
            else if (p.NumberOfElements() == 1)
            {
                if (n2.elements[0] < p.elements[0])
                {
                    p.children[2] = p.children[1];
                    p.children[0] = n1;
                    p.children[1] = n2;
                }
                else
                {
                    p.children[1] = n1;
                    p.children[2] = n2;
                }
                n1.isLeaf = true;
                n2.isLeaf = true;

            }
            else
            {
                if (n2.elements[0] < p.elements[0] && n2.elements[0] < p.elements[1])
                {
                    p.children[3] = p.children[2];
                    p.children[2] = p.children[1];
                    p.children[0] = n1;
                    p.children[1] = n2;
                }
                else if (n1.elements[0] > p.elements[0] && n1.elements[0] > p.elements[1])
                {
                    p.children[2] = n1;
                    p.children[3] = n2;
                }

                else
                {
                    p.children[3] = p.children[2];
                    p.children[1] = n1;
                    p.children[2] = n2;
                }
            }

            //if it is not a leaf check
            if (twoThreeNode.IsLeaf() == false)
            {
                twoThreeNode.children[0].parent = n1;
                twoThreeNode.children[1].parent = n1;
                twoThreeNode.children[2].parent = n2;
                twoThreeNode.children[3].parent = n2;
                n1.children[0] = twoThreeNode.children[0];
                n1.children[1] = twoThreeNode.children[1];
                n2.children[0] = twoThreeNode.children[2];
                n2.children[1] = twoThreeNode.children[3];
                n1.isLeaf = false;
                n2.isLeaf = false;
            }

            if (p.NumberOfElements() == 2)
            {
                this.Split(p, middle);
                if (n1.children[0] != null || n2.children[0] != null)
                {
                    if (n1.children[0].IsLeaf() || n2.children[0].IsLeaf())
                    {
                        n1.isLeaf = false;
                        n2.isLeaf = false;
                    }
                }
                else
                {
                    n1.isLeaf = true;
                    n2.isLeaf = true;
                }

                n1.parent.isLeaf = false;
                n2.parent.isLeaf = false;

            }

            else if (p.NumberOfElements() == 1)
            {
                if (p.elements[0] < middle)
                {
                    p.elements[1] = middle;
                }
                else
                {
                    p.elements[1] = p.elements[0];
                    p.elements[0] = middle;
                }

            }

            else
            {
                p.elements[0] = middle;

            }
        }
Exemplo n.º 8
0
        public override void Split(TreeNode twoThreeNode, int element)
        {
            TwoThreeTreeNode p;

            if (twoThreeNode.parent == null)
            {
                p = new TwoThreeTreeNode();
            }
            else
            {
                p = (TwoThreeTreeNode)twoThreeNode.parent;
            }

            TwoThreeTreeNode n1 = new TwoThreeTreeNode();
            TwoThreeTreeNode n2 = new TwoThreeTreeNode();

            int small, middle, large;

            if (element < twoThreeNode.elements[0])
            {
                small  = element;
                middle = twoThreeNode.elements[0];
                large  = twoThreeNode.elements[1];
            }
            else if (element > twoThreeNode.elements[1])
            {
                small  = twoThreeNode.elements[0];
                middle = twoThreeNode.elements[1];
                large  = element;
            }
            else
            {
                small  = twoThreeNode.elements[0];
                middle = element;
                large  = twoThreeNode.elements[1];
            }

            n1.elements[0] = small;
            n2.elements[0] = large;

            n1.parent = p;
            n2.parent = p;

            if (p.NumberOfElements() == 0)
            {
                p.children[0] = n1;
                p.children[1] = n2;
                root          = p;
                n1.isLeaf     = true;
                n2.isLeaf     = true;
            }
            else if (p.NumberOfElements() == 1)
            {
                if (n2.elements[0] < p.elements[0])
                {
                    p.children[2] = p.children[1];
                    p.children[0] = n1;
                    p.children[1] = n2;
                }

                else
                {
                    p.children[1] = n1;
                    p.children[2] = n2;
                }
                n1.isLeaf = true;
                n2.isLeaf = true;
            }
            else
            {
                if (n2.elements[0] < p.elements[0] && n2.elements[0] < p.elements[1])
                {
                    p.children[3] = p.children[2];
                    p.children[2] = p.children[1];
                    p.children[0] = n1;
                    p.children[1] = n2;
                }
                else
                if (n1.elements[0] > p.elements[0] && n1.elements[0] > p.elements[1])
                {
                    p.children[2] = n1;
                    p.children[3] = n2;
                }

                else
                {
                    p.children[3] = p.children[2];
                    p.children[1] = n1;
                    p.children[2] = n2;
                }
            }

            if (twoThreeNode.IsLeaf() == false)
            {
                twoThreeNode.children[0].parent = n1;
                twoThreeNode.children[1].parent = n1;
                twoThreeNode.children[2].parent = n2;
                twoThreeNode.children[3].parent = n2;
                n1.children[0] = twoThreeNode.children[0];
                n1.children[1] = twoThreeNode.children[1];
                n2.children[0] = twoThreeNode.children[2];
                n2.children[1] = twoThreeNode.children[3];
                n1.isLeaf      = false;
                n2.isLeaf      = false;
            }

            if (p.NumberOfElements() == 2)
            {
                Split(p, middle);
                if (n1.children[0] != null || n2.children[0] != null)
                {
                    if (n1.children[0].IsLeaf() || n2.children[0].IsLeaf())
                    {
                        n1.isLeaf = false;
                        n2.isLeaf = false;
                    }
                }

                else
                {
                    n1.isLeaf = true;
                    n2.isLeaf = true;
                }
                n1.parent.isLeaf = false;
                n2.parent.isLeaf = false;
            }

            else if (p.NumberOfElements() == 1)
            {
                if (p.elements[0] < middle)
                {
                    p.elements[1] = middle;
                }

                else
                {
                    p.elements[1] = p.elements[0];
                    p.elements[0] = middle;
                }
            }

            else
            {
                p.elements[0] = middle;
            }
        }
Exemplo n.º 9
0
        public void Merge(TreeNode node)
        {
            if (node.parent.NumberOfElements() == 1)
            {
                if (node.parent.children[0] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.children[1].elements[0];
                    node.parent.children[1].elements[0] = node.parent.elements[0];
                    node.parent.elements[0]             = 0;

                    node.parent.children[0] = node.parent.children[1];
                    node.parent.children[1] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.parent.children[0].children[1];
                        node.parent.children[0].children[1] = node.parent.children[0].children[0];
                        node.parent.children[0].children[0] = node.children[0];

                        node.parent.children[0].children[0].parent = node.parent.children[0];
                    }
                }

                else
                {
                    node.parent.children[0].elements[1] = node.parent.elements[0];
                    node.parent.elements[0]             = 0;

                    node.parent.children[1] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2]        = node.children[0];
                        node.parent.children[0].children[2].parent = node.parent.children[0];
                    }
                }
            }

            else if (node.parent.NumberOfElements() == 2)
            {
                if (node.parent.children[0] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.children[1].elements[0];
                    node.parent.children[1].elements[0] = node.parent.elements[0];
                    node.parent.elements[0]             = node.parent.elements[1];
                    node.parent.elements[1]             = 0;

                    node.parent.children[0] = node.parent.children[1];
                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.parent.children[0].children[1];
                        node.parent.children[0].children[1] = node.parent.children[0].children[0];
                        node.parent.children[0].children[0] = node.children[0];

                        node.parent.children[0].children[0].parent = node.parent.children[0];
                    }
                }

                else if (node.parent.children[1] == node)
                {
                    node.parent.children[0].elements[1] = node.parent.elements[0];
                    node.parent.elements[0]             = node.parent.elements[1];
                    node.parent.elements[1]             = 0;

                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2]        = node.children[0];
                        node.parent.children[0].children[2].parent = node.parent.children[0];
                    }
                }

                else
                {
                    node.parent.children[1].elements[1] = node.parent.elements[1];
                    node.parent.elements[1]             = 0;

                    node.parent.children[2] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[1].children[2]        = node.children[0];
                        node.parent.children[1].children[2].parent = node.parent.children[1];
                    }
                }
            }
            else if (node.parent.NumberOfElements() == 3)
            {
                if (node.parent.children[0] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.children[1].elements[0];
                    node.parent.children[1].elements[0] = node.parent.elements[0];
                    node.parent.elements[0]             = node.parent.elements[1];
                    node.parent.elements[1]             = node.parent.elements[2];
                    node.parent.elements[2]             = 0;

                    node.parent.children[0] = node.parent.children[1];
                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = node.parent.children[3];
                    node.parent.children[3] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2] = node.parent.children[0].children[1];
                        node.parent.children[0].children[1] = node.parent.children[0].children[0];
                        node.parent.children[0].children[0] = node.children[0];

                        node.parent.children[0].children[0].parent = node.parent.children[0];
                    }
                }
                else if (node.parent.children[1] == node)
                {
                    node.parent.children[0].elements[1] = node.parent.elements[0];
                    node.parent.elements[0]             = node.parent.elements[1];
                    node.parent.elements[1]             = node.parent.elements[2];
                    node.parent.elements[2]             = 0;

                    node.parent.children[1] = node.parent.children[2];
                    node.parent.children[2] = node.parent.children[3];
                    node.parent.children[3] = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[0].children[2]        = node.children[0];
                        node.parent.children[0].children[2].parent = node.parent.children[0];
                    }
                }
                else if (node.parent.children[2] == node)
                {
                    node.parent.children[1].elements[1] = node.parent.elements[1];
                    node.parent.elements[1]             = node.parent.elements[2];
                    node.parent.elements[2]             = 0;
                    node.parent.children[2]             = node.parent.children[3];
                    node.parent.children[3]             = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[1].children[2]        = node.children[0];
                        node.parent.children[1].children[2].parent = node.parent.children[1];
                    }
                }
                else if (node.parent.children[3] == node)
                {
                    node.parent.children[2].elements[1] = node.parent.elements[2];
                    node.parent.elements[2]             = 0;
                    node.parent.children[3]             = null;

                    if (node.IsLeaf() == false)
                    {
                        node.parent.children[2].children[2]        = node.children[0];
                        node.parent.children[2].children[2].parent = node.parent.children[2];
                    }
                }
            }
        }
Exemplo n.º 10
0
        public TreeNode DeleteElement(int element)
        {
            int      inOrderInd;
            TreeNode leafNode;
            TreeNode inOrderSuccessor;
            int      tempElement;
            TreeNode shouldFixed = null;
            TreeNode node        = FindNode(root, element);

            if (node != null)
            {
                int ind = node.elements[0] == element ? 0 : node.elements[1] == element ? 1 : 2;

                if (node.IsLeaf() == false)
                {
                    inOrderSuccessor   = InOrderSuccessor(element, node);
                    inOrderInd         = 0;
                    tempElement        = node.elements[ind];
                    node.elements[ind] = inOrderSuccessor.elements[inOrderInd];
                    inOrderSuccessor.elements[inOrderInd] = tempElement;

                    leafNode = inOrderSuccessor;
                }
                else
                {
                    leafNode = node;
                }

                if (element == leafNode.elements[0])
                {
                    if (leafNode.NumberOfElements() == 1)
                    {
                        leafNode.elements[0] = 0;
                    }
                    else if (leafNode.NumberOfElements() == 2)
                    {
                        leafNode.elements[0] = leafNode.elements[1];
                        leafNode.elements[1] = 0;
                    }
                    else
                    {
                        leafNode.elements[0] = leafNode.elements[1];
                        leafNode.elements[1] = leafNode.elements[2];
                        leafNode.elements[2] = 0;
                    }
                }
                else if (element == leafNode.elements[1])
                {
                    if (leafNode.NumberOfElements() == 2)
                    {
                        leafNode.elements[1] = 0;
                    }
                    else
                    {
                        leafNode.elements[1] = leafNode.elements[2];
                        leafNode.elements[2] = 0;
                    }
                }

                else if (element == leafNode.elements[2])
                {
                    leafNode.elements[2] = 0;
                }
                else
                {
                    Console.WriteLine("There must be a mistake, element couldn't be found in the node!");
                }

                if (leafNode.NumberOfElements() == 0)
                {
                    shouldFixed = leafNode;
                }
            }
            else
            {
                Console.WriteLine(element + " Couldn't found in the tree, thus process terminated");
            }

            return(shouldFixed);
        }