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