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); }
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); }
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); }
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); }
/// <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 }