RBNode <T> MoveRedRight(RBNode <T> node) { node.ColorFlip(); if (IsNodeRed(node.LeftChild.LeftChild)) { node = node.RotateRight(); node.ColorFlip(); } return(node); }
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); }
// 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)); }
// 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)); }