private void InsertFixup(RedBlackTreeNode <T> node) { while (node.GetParentNode().Color == NodeColor.Red) { #region Left if (node.GetParentNode() == node.GetGrandparentNode().Left) { var uncle = node.GetGrandparentNode().Right.ToRedBlackTreeNode(); #region //case 1 uncle is red then red up if (uncle.Color == NodeColor.Red) { node.GetParentNode().Color = NodeColor.Black; uncle.Color = NodeColor.Black; node.GetGrandparentNode().Color = NodeColor.Red; node = node.GetGrandparentNode(); } #endregion else { #region // case 2 uncle is black, node is right if (node == node.GetParentNode().Right) { node = node.GetParentNode(); LeftRotate(node); } #endregion #region // case 2 uncle is black, node is left。变成一条线再旋转 node.GetParentNode().Color = NodeColor.Black; node.GetGrandparentNode().Color = NodeColor.Red; RightRotate(node.GetGrandparentNode()); #endregion } } #endregion #region right else { var uncle = node.GetGrandparentNode().Left.ToRedBlackTreeNode(); #region case 1 red up if (uncle.Color == NodeColor.Red) { node.GetParentNode().Color = NodeColor.Black; uncle.Color = NodeColor.Black; node.GetGrandparentNode().Color = NodeColor.Red; node = node.GetGrandparentNode(); } #endregion else { if (node == node.GetParentNode().Left) { node = node.GetParentNode(); RightRotate(node); } node.GetParentNode().Color = NodeColor.Black; node.GetGrandparentNode().Color = NodeColor.Red; LeftRotate(node.GetGrandparentNode()); } } #endregion } var root = Root.ToRedBlackTreeNode(); //保证性质2 root.Color = NodeColor.Black; }
public static RedBlackTreeNode <T> GetGrandparentNode <T>(this RedBlackTreeNode <T> node) { return(node.GetParentNode().GetParentNode()); }
//空节点的Parent属性不可靠,只能存储起来。 private void DeleteFixup(RedBlackTreeNode <T> node) { while (node != Root && node.Color == NodeColor.Black) { var parent = node.Parent.ToRedBlackTreeNode(); #region left if (node == parent.Left) { #region case1 brother is red var brother = parent.Right.ToRedBlackTreeNode(); if (brother.Color == NodeColor.Red) { brother.Color = NodeColor.Black; parent.Color = NodeColor.Red; LeftRotate(parent); brother = parent.Right.ToRedBlackTreeNode(); } #endregion #region case2 brother child all black if ( ( brother.Left.ToRedBlackTreeNode().Color == NodeColor.Black) && ( brother.Right.ToRedBlackTreeNode().Color == NodeColor.Black)) { brother.Color = NodeColor.Red; node = parent; parent = node.GetParentNode(); } #endregion else { #region case3 brother right child is black if ( brother.Right.ToRedBlackTreeNode().Color == NodeColor.Black) { brother.Left.ToRedBlackTreeNode().Color = NodeColor.Black; brother.Color = NodeColor.Red; RightRotate(brother); brother = parent.Right.ToRedBlackTreeNode(); } #endregion #region case4 brother right child is red brother.Color = parent.Color; parent.Color = NodeColor.Black; brother.Right.ToRedBlackTreeNode().Color = NodeColor.Black; LeftRotate(parent); node = Root.ToRedBlackTreeNode(); #endregion } } #endregion #region right else { #region case1 brother is red var brother = parent.Left.ToRedBlackTreeNode(); if (brother.Color == NodeColor.Red) { brother.Color = NodeColor.Black; parent.Color = NodeColor.Red; RightRotate(parent); brother = parent.Left.ToRedBlackTreeNode(); } #endregion #region case2 brother child all black if ( ( brother.Left.ToRedBlackTreeNode().Color == NodeColor.Black) && ( brother.Right.ToRedBlackTreeNode().Color == NodeColor.Black)) { brother.Color = NodeColor.Red; node = parent; parent = node.GetParentNode(); } #endregion else { #region case3 brother right child is black if (brother.Left.ToRedBlackTreeNode().Color == NodeColor.Black) { brother.Right.ToRedBlackTreeNode().Color = NodeColor.Black; brother.Color = NodeColor.Red; LeftRotate(brother); brother = parent.Left.ToRedBlackTreeNode(); } #endregion #region case4 brother right child is red brother.Color = parent.Color; parent.Color = NodeColor.Black; brother.Left.ToRedBlackTreeNode().Color = NodeColor.Black; RightRotate(parent); node = Root.ToRedBlackTreeNode(); #endregion } } #endregion } node.Color = NodeColor.Black; }