예제 #1
0
        private void RoateNode(RBTreeNode <T> inputNode)
        {
            var parentNode = inputNode.Parent;

            var parentparentNode = parentNode.Parent;

            if (!parentNode.IfIsRed)
            {
                return;
            }

            if ((inputNode == parentNode.LeftNode && parentNode == parentparentNode.LeftNode)
                ||
                (inputNode == parentNode.RightNode && parentNode == parentparentNode.RightNode))
            {
                parentparentNode.ChangeColor();
                parentNode.ChangeColor();

                if (parentNode == parentparentNode.LeftNode)
                {
                    parentparentNode.RightRoate(this);
                }
                else
                {
                    parentparentNode.LeftRoate(this);
                }
            }
            else
            {
                parentparentNode.ChangeColor();
                inputNode.ChangeColor();

                if (inputNode == parentNode.LeftNode)
                {
                    parentNode.RightRoate(this);
                }
                else
                {
                    parentNode.LeftRoate(this);
                }

                if (inputNode == parentparentNode.LeftNode)
                {
                    parentparentNode.RightRoate(this);
                }
                else
                {
                    parentparentNode.LeftRoate(this);
                }
            }

            ChangeColor(parentparentNode.Parent);
        }
예제 #2
0
        private bool ChangeColor(RBTreeNode <T> inputNode)
        {
            if (!inputNode.IfIsRed && null != inputNode.LeftNode && null != inputNode.RightNode && inputNode.LeftNode.IfIsRed && inputNode.RightNode.IfIsRed)
            {
                inputNode.LeftNode.ChangeColor();
                inputNode.RightNode.ChangeColor();

                if (inputNode != RootNode)
                {
                    inputNode.ChangeColor();
                    return(true);
                }
                else
                {
                    return(false);
                }
            }

            return(false);
        }