Beispiel #1
0
        public void RotateLeft_CheckColours()
        {
            RedBlackNode <int> node = new RedBlackNode <int>(100);

            node.Right = new RedBlackNode <int>(150);
            node       = node.RotateLeft() as RedBlackNode <int>;

            Assert.IsFalse(node.IsRed);
            Assert.IsTrue(node.Left.IsRed);
        }
Beispiel #2
0
        public void RotateLeft_FullTree()
        {
            RedBlackNode <int> node = new RedBlackNode <int>(100);

            node.Left  = new RedBlackNode <int>(50);
            node.Right = new RedBlackNode <int>(150);

            node.Left.Left   = new RedBlackNode <int>(25);
            node.Left.Right  = new RedBlackNode <int>(75);
            node.Right.Left  = new RedBlackNode <int>(125);
            node.Right.Right = new RedBlackNode <int>(175);

            node.ResetHeight();
            node.Left.ResetHeight();
            node.Right.ResetHeight();
            node.Left.Left.ResetHeight();
            node.Left.Right.ResetHeight();
            node.Right.Left.ResetHeight();
            node.Right.Right.ResetHeight();

            node = node.RotateLeft() as RedBlackNode <int>;

            Assert.AreEqual <int>(150, node.Value);
            Assert.AreEqual <int>(175, node.Right.Value);
            Assert.AreEqual <int>(100, node.Left.Value);
            Assert.AreEqual <int>(125, node.Left.Right.Value);
            Assert.AreEqual <int>(50, node.Left.Left.Value);
            Assert.AreEqual <int>(25, node.Left.Left.Left.Value);
            Assert.AreEqual <int>(75, node.Left.Left.Right.Value);

            Assert.AreEqual <int>(3, node.Height);
            Assert.AreEqual <int>(0, node.Right.Height);
            Assert.AreEqual <int>(2, node.Left.Height);
            Assert.AreEqual <int>(1, node.Left.Left.Height);
            Assert.AreEqual <int>(0, node.Left.Right.Height);
            Assert.AreEqual <int>(0, node.Left.Left.Left.Height);
            Assert.AreEqual <int>(0, node.Left.Left.Right.Height);
        }
Beispiel #3
0
        public void RotateLeft_FullTree()
        {
            RedBlackNode<int> node = new RedBlackNode<int>(100);

            node.Left = new RedBlackNode<int>(50);
            node.Right = new RedBlackNode<int>(150);

            node.Left.Left = new RedBlackNode<int>(25);
            node.Left.Right = new RedBlackNode<int>(75);
            node.Right.Left = new RedBlackNode<int>(125);
            node.Right.Right = new RedBlackNode<int>(175);

            node.ResetHeight();
            node.Left.ResetHeight();
            node.Right.ResetHeight();
            node.Left.Left.ResetHeight();
            node.Left.Right.ResetHeight();
            node.Right.Left.ResetHeight();
            node.Right.Right.ResetHeight();

            node = node.RotateLeft() as RedBlackNode<int>;

            Assert.AreEqual<int>(150, node.Value);
            Assert.AreEqual<int>(175, node.Right.Value);
            Assert.AreEqual<int>(100, node.Left.Value);
            Assert.AreEqual<int>(125, node.Left.Right.Value);
            Assert.AreEqual<int>(50, node.Left.Left.Value);
            Assert.AreEqual<int>(25, node.Left.Left.Left.Value);
            Assert.AreEqual<int>(75, node.Left.Left.Right.Value);

            Assert.AreEqual<int>(3, node.Height);
            Assert.AreEqual<int>(0, node.Right.Height);
            Assert.AreEqual<int>(2, node.Left.Height);
            Assert.AreEqual<int>(1, node.Left.Left.Height);
            Assert.AreEqual<int>(0, node.Left.Right.Height);
            Assert.AreEqual<int>(0, node.Left.Left.Left.Height);
            Assert.AreEqual<int>(0, node.Left.Left.Right.Height);
        }
Beispiel #4
0
        public void RotateLeft_CheckColours()
        {
            RedBlackNode<int> node = new RedBlackNode<int>(100);
            node.Right = new RedBlackNode<int>(150);
            node = node.RotateLeft() as RedBlackNode<int>;

            Assert.IsFalse(node.IsRed);
            Assert.IsTrue(node.Left.IsRed);
        }
Beispiel #5
0
        /// <summary>
        /// Corects tree.
        /// </summary>
        /// <param name="node">Start fom this node.</param>
        private void RepairTree(RedBlackNode node)
        {
            if (node == this.rootNode)
            {
                return;
            }
            //if (node.ParentNode == null)//case1
            //{
            //    this.rootNode = node;
            //    node.Color = NodeColor.BLACK;
            //}
            if (node.ParentNode.Color == NodeColor.BLACK)
            {
                return;
            }
            if (node.Uncle != null && node.Uncle.Color == NodeColor.RED)
            {
                //What if Uncle == null

                node.ParentNode.Color  = NodeColor.BLACK;
                node.Uncle.Color       = NodeColor.BLACK;
                node.Grandparent.Color = NodeColor.RED;
                RepairTree(node.Grandparent);
                return;
            }    //case 3
            else //case 4
            {
                RedBlackNode p = node.ParentNode;
                RedBlackNode g = node.Grandparent;

                if (p == g.RightNode)
                {
                    if (node == p.RightNode)
                    {
                        g.RotateLeft();
                        if (p.ParentNode == null)
                        {
                            this.rootNode = p;
                        }
                        return;
                    }
                    node.ParentNode.RotateRight();
                    node.ParentNode.RotateLeft();
                    if (node == null)
                    {
                        this.rootNode = node;
                    }
                    return;
                }
                if (node == p.LeftNode)
                {
                    g.RotateRight();
                    if (p.ParentNode == null)
                    {
                        this.rootNode = p;
                    }
                    return;
                }
                node.ParentNode.RotateLeft();
                node.ParentNode.RotateRight();

                if (node == null)
                {
                    this.rootNode = node;
                }
                return;
            }//case4
        }
Beispiel #6
0
        /// <summary>
        /// Removes the elemet from tree.
        /// </summary>
        /// <param name="item">Key Value pair of the elemet.</param>
        /// <returns>True if removed.</returns>
        public bool Remove(KeyValuePair <TKey, TValue> item)
        {
            RedBlackNode temp = this.rootNode;

            while (temp != null)
            {
                switch (item.Key.CompareTo(temp.NodeKey))
                {
                case -1:
                    temp = temp.LeftNode;
                    break;

                case 1:
                    temp = temp.RightNode;
                    break;

                default:
                {
                    if (temp.IsLeaf)
                    {
                        if (temp.ParentNode.LeftNode == temp)
                        {
                            temp.ParentNode.LeftNode = null;
                            this.RepairTree(temp.ParentNode);
                            nodeCount--;
                            isModfied = true;
                            return(true);
                        }
                        temp.ParentNode.RightNode = null;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                    else if (temp.LeftNode == null)
                    {
                        temp.RightNode.ParentNode = temp.ParentNode;
                        if (temp.ParentNode.LeftNode == temp)
                        {
                            temp.ParentNode.LeftNode = temp.RightNode;
                            this.RepairTree(temp.ParentNode);
                            nodeCount--;
                            isModfied = true;
                            return(true);
                        }
                        temp.ParentNode.RightNode = null;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                    else if (temp.RightNode == null)
                    {
                        temp.LeftNode.ParentNode = temp.ParentNode;
                        if (temp.ParentNode.LeftNode == temp)
                        {
                            temp.ParentNode.LeftNode = temp.LeftNode;
                            this.RepairTree(temp.ParentNode);
                            nodeCount--;
                            isModfied = true;
                            return(true);
                        }
                        temp.ParentNode.RightNode = null;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                    else
                    {
                        temp.RotateLeft();
                        temp.ParentNode.LeftNode = temp.LeftNode;
                        temp.LeftNode.ParentNode = temp.ParentNode;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                }
                }
            }
            return(false);
        }