Esempio n. 1
0
 public static RedBlackTreeNode <T> GetGrandparentNode <T>(this RedBlackTreeNode <T> node)
 {
     return(node.GetParentNode().GetParentNode());
 }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
 public static RedBlackTreeNode <T> GetParentNode <T>(this RedBlackTreeNode <T> node)
 {
     return(node.Parent as RedBlackTreeNode <T>);
 }
Esempio n. 4
0
        //空节点的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;
        }