示例#1
0
        private void InsertFix(RBNode node)
        {
            while (node.Parent.IsRed)
            {
                if (node.Parent == node.Parent.Parent.LeftChild)
                {
                    var uncle = node.Parent.Parent.RightChild;
                    if (uncle.IsRed)
                    {
                        node.Parent.ColorBlack();
                        uncle.ColorBlack();
                        node = node.Parent.Parent;
                        node.ColorRed();
                    }
                    else
                    {
                        if (node == node.Parent.RightChild)
                        {
                            node = node.Parent;
                            RotateLeft(node);
                        }
                        node.Parent.ColorBlack();
                        node.Parent.Parent.ColorRed();
                        RotateRight(node.Parent.Parent);
                    }
                }
                else // Repeat for RightChild case
                {
                    var uncle = node.Parent.Parent.LeftChild;
                    if (uncle.IsRed)
                    {
                        node.Parent.ColorBlack();
                        uncle.ColorBlack();
                        node = node.Parent.Parent;
                        node.ColorRed();
                    }
                    else
                    {
                        if (node == node.Parent.LeftChild)
                        {
                            node = node.Parent;
                            RotateRight(node);
                        }
                        node.Parent.ColorBlack();
                        node.Parent.Parent.ColorRed();
                        RotateLeft(node.Parent.Parent);
                    }
                }
            }

            // Color the root black
            Root.ColorBlack();
        }
示例#2
0
        private RBNode NewRBNode(T data)
        {
            var node = new RBNode(data);

            node.Parent     = NullNode;
            node.LeftChild  = NullNode;
            node.RightChild = NullNode;
            node.ColorRed();
            return(node);
        }