コード例 #1
0
ファイル: RBNode.cs プロジェクト: beda2280/wpf-1
 RBNode <T> MoveRedRight(RBNode <T> node)
 {
     node.ColorFlip();
     if (IsNodeRed(node.LeftChild.LeftChild))
     {
         node = node.RotateRight();
         node.ColorFlip();
     }
     return(node);
 }
コード例 #2
0
ファイル: RBNode.cs プロジェクト: beda2280/wpf-1
 RBNode <T> Fixup(RBNode <T> node)
 {
     if (!IsNodeRed(node.LeftChild) && IsNodeRed(node.RightChild))
     {
         node = node.RotateLeft();
     }
     if (IsNodeRed(node.LeftChild) && IsNodeRed(node.LeftChild.LeftChild))
     {
         node = node.RotateRight();
     }
     if (IsNodeRed(node.LeftChild) && IsNodeRed(node.RightChild))
     {
         node.ColorFlip();
     }
     return(node);
 }
コード例 #3
0
ファイル: RBNode.cs プロジェクト: beda2280/wpf-1
        // invariant:  node is red, or one if its children is red
        // As we move down the tree this is preserved by calling MoveRedLeft or
        // MoveRedRight, to "borrow red-ness" from a sibling.
        protected RBNode <T> DeleteNode(RBNode <T> parent, RBNode <T> node, int index)
        {
            if (index < node.LeftSize || (index == node.LeftSize && node.Size > 0))
            {
                if (!IsNodeRed(node.LeftChild) && !IsNodeRed(node.LeftChild.LeftChild))
                {
                    node = MoveRedLeft(node);
                }
                node.LeftChild = DeleteNode(node, node.LeftChild, index);
            }
            else
            {
                bool deleteHere = (index == node.LeftSize);
                Debug.Assert(!deleteHere || node.Size == 0, "DeleteNode: Deleted node should be empty");

                if (IsNodeRed(node.LeftChild))
                {
                    node       = node.RotateRight();
                    deleteHere = false;
                }
                if (deleteHere && node.RightChild == null)
                {
                    return(null);
                }
                if (!IsNodeRed(node.RightChild) && !IsNodeRed(node.RightChild.LeftChild))
                {
                    RBNode <T> temp = node;
                    node       = MoveRedRight(node);
                    deleteHere = deleteHere && (temp == node);
                }

                if (deleteHere)
                {
                    RBNode <T> sub;
                    node.RightChild = DeleteLeftmost(node.RightChild, out sub);
                    node            = Substitute(node, sub, parent);
                }
                else
                {
                    node.RightChild = DeleteNode(node, node.RightChild, index - node.LeftSize - node.Size);
                }
            }

            return(Fixup(node));
        }
コード例 #4
0
 // Token: 0x0600769A RID: 30362 RVA: 0x0021E528 File Offset: 0x0021C728
 protected RBNode <T> DeleteNode(RBNode <T> parent, RBNode <T> node, int index)
 {
     if (index < node.LeftSize || (index == node.LeftSize && node.Size > 0))
     {
         if (!this.IsNodeRed(node.LeftChild) && !this.IsNodeRed(node.LeftChild.LeftChild))
         {
             node = this.MoveRedLeft(node);
         }
         node.LeftChild = this.DeleteNode(node, node.LeftChild, index);
     }
     else
     {
         bool flag = index == node.LeftSize;
         if (this.IsNodeRed(node.LeftChild))
         {
             node = node.RotateRight();
             flag = false;
         }
         if (flag && node.RightChild == null)
         {
             return(null);
         }
         if (!this.IsNodeRed(node.RightChild) && !this.IsNodeRed(node.RightChild.LeftChild))
         {
             RBNode <T> rbnode = node;
             node = this.MoveRedRight(node);
             flag = (flag && rbnode == node);
         }
         if (flag)
         {
             RBNode <T> sub;
             node.RightChild = this.DeleteLeftmost(node.RightChild, out sub);
             node            = this.Substitute(node, sub, parent);
         }
         else
         {
             node.RightChild = this.DeleteNode(node, node.RightChild, index - node.LeftSize - node.Size);
         }
     }
     return(this.Fixup(node));
 }