private void InsertFix(RBNode node) { while (node.Parent.IsRed) { if (node.Parent == node.Parent.Parent.LeftChild) { var uncle = node.Parent.Parent.RightChild; if (uncle.IsRed) { node.Parent.ColorBlack(); uncle.ColorBlack(); node = node.Parent.Parent; node.ColorRed(); } else { if (node == node.Parent.RightChild) { node = node.Parent; RotateLeft(node); } node.Parent.ColorBlack(); node.Parent.Parent.ColorRed(); RotateRight(node.Parent.Parent); } } else // Repeat for RightChild case { var uncle = node.Parent.Parent.LeftChild; if (uncle.IsRed) { node.Parent.ColorBlack(); uncle.ColorBlack(); node = node.Parent.Parent; node.ColorRed(); } else { if (node == node.Parent.LeftChild) { node = node.Parent; RotateRight(node); } node.Parent.ColorBlack(); node.Parent.Parent.ColorRed(); RotateLeft(node.Parent.Parent); } } } // Color the root black Root.ColorBlack(); }
private RBNode NewRBNode(T data) { var node = new RBNode(data); node.Parent = NullNode; node.LeftChild = NullNode; node.RightChild = NullNode; node.ColorRed(); return(node); }