public RedBlackTree(T parentValue) { this.count = 1; this.Root = new RedBlackNode <T>(parentValue, NodeColor.Black); }
private void InsertFixup(RedBlackNode <T> node) { while (node.Parent.Color == NodeColor.Red) { if (object.ReferenceEquals(node.Parent, node.Parent.Parent.LeftChild)) { RedBlackNode <T> y = node.Parent.Parent.RigthChild; if (y.Color == NodeColor.Red) { node.Parent.Color = NodeColor.Black; y.Color = NodeColor.Black; node.Parent.Parent.Color = NodeColor.Red; node = node.Parent.Parent; } else if (object.ReferenceEquals(node, node.Parent.RigthChild)) { node = node.Parent; LeftRotate(node); } else { node.Parent.Color = NodeColor.Black; node.Parent.Parent.Color = NodeColor.Red; RigthRotate(node.Parent.Parent); } } else if (object.ReferenceEquals(node.Parent, node.Parent.Parent.RigthChild)) { RedBlackNode <T> y = node.Parent.Parent.LeftChild; if (y.Color == NodeColor.Red) { node.Parent.Color = NodeColor.Black; y.Color = NodeColor.Black; node.Parent.Parent.Color = NodeColor.Red; node = node.Parent.Parent; } else if (object.ReferenceEquals(node, node.Parent.LeftChild)) { node = node.Parent; RigthRotate(node); } else { node.Parent.Color = NodeColor.Black; node.Parent.Parent.Color = NodeColor.Red; LeftRotate(node.Parent.Parent); } } if (node.Parent == null) { break; } } this.Root.Color = NodeColor.Black; }