示例#1
0
        public void RotateRight_CheckColours()
        {
            RedBlackNode <int> node = new RedBlackNode <int>(100);

            node.Left = new RedBlackNode <int>(50);
            node      = node.RotateRight() as RedBlackNode <int>;

            Assert.IsFalse(node.IsRed);
            Assert.IsTrue(node.Right.IsRed);
        }
示例#2
0
        public void RotateRight_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.RotateRight() as RedBlackNode <int>;

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


            Assert.AreEqual <int>(3, node.Height);
            Assert.AreEqual <int>(0, node.Left.Height);
            Assert.AreEqual <int>(2, node.Right.Height);
            Assert.AreEqual <int>(1, node.Right.Right.Height);
            Assert.AreEqual <int>(0, node.Right.Left.Height);
            Assert.AreEqual <int>(0, node.Right.Right.Right.Height);
            Assert.AreEqual <int>(0, node.Right.Right.Left.Height);
        }
示例#3
0
        public void RotateRight_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.RotateRight() as RedBlackNode<int>;

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

            Assert.AreEqual<int>(3, node.Height);
            Assert.AreEqual<int>(0, node.Left.Height);
            Assert.AreEqual<int>(2, node.Right.Height);
            Assert.AreEqual<int>(1, node.Right.Right.Height);
            Assert.AreEqual<int>(0, node.Right.Left.Height);
            Assert.AreEqual<int>(0, node.Right.Right.Right.Height);
            Assert.AreEqual<int>(0, node.Right.Right.Left.Height);
        }
示例#4
0
        public void RotateRight_CheckColours()
        {
            RedBlackNode<int> node = new RedBlackNode<int>(100);
            node.Left = new RedBlackNode<int>(50);
            node = node.RotateRight() as RedBlackNode<int>;

            Assert.IsFalse(node.IsRed);
            Assert.IsTrue(node.Right.IsRed);
        }
示例#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
        }