Beispiel #1
0
        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++;
        }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
 private static bool Is4Node(TreeSet <T> .Node node)
 {
     return(TreeSet <T> .IsRed(node.Left) && TreeSet <T> .IsRed(node.Right));
 }