public void Add(T item) { if (this.root == null) { this.root = new TreeSet <T> .Node(item, false); this.count = 1; return; } TreeSet <T> .Node node = this.root; TreeSet <T> .Node node2 = null; TreeSet <T> .Node node3 = null; TreeSet <T> .Node greatGrandParent = null; int num = 0; while (node != null) { num = this.comparer.Compare(item, node.Item); if (num == 0) { this.root.IsRed = false; throw new ArgumentException("Key Duplicated."); } if (TreeSet <T> .Is4Node(node)) { TreeSet <T> .Split4Node(node); if (TreeSet <T> .IsRed(node2)) { this.InsertionBalance(node, ref node2, node3, greatGrandParent); } } greatGrandParent = node3; node3 = node2; node2 = node; node = ((num < 0) ? node.Left : node.Right); } TreeSet <T> .Node node4 = new TreeSet <T> .Node(item); if (num > 0) { node2.Right = node4; } else { node2.Left = node4; } if (node2.IsRed) { this.InsertionBalance(node4, ref node2, node3, greatGrandParent); } this.root.IsRed = false; this.count++; this.version++; }
private static TreeRotation RotationNeeded(TreeSet <T> .Node parent, TreeSet <T> .Node current, TreeSet <T> .Node sibling) { if (TreeSet <T> .IsRed(sibling.Left)) { if (parent.Left == current) { return(TreeRotation.RightLeftRotation); } return(TreeRotation.RightRotation); } else { if (parent.Left == current) { return(TreeRotation.LeftRotation); } return(TreeRotation.LeftRightRotation); } }
private static bool Is4Node(TreeSet <T> .Node node) { return(TreeSet <T> .IsRed(node.Left) && TreeSet <T> .IsRed(node.Right)); }