Exemple #1
0
        public int Height(RBTreeNode <TKey> node)
        {
            if (node == null)
            {
                return(0);
            }

            int lHeight = Height(node.Left);
            int rHeight = Height(node.Right);

            if (lHeight > rHeight)
            {
                return(lHeight + 1);
            }
            else
            {
                return(rHeight + 1);
            }
        }
Exemple #2
0
        public void Delete(RBTreeNode <TKey> deleteNode)
        {
            RBTreeNode <TKey> linkedNode, workNode = deleteNode;
            var workNodeOriginalColor = workNode.Color;

            if (deleteNode.Left == Leaf)
            {
                linkedNode = deleteNode.Right;
                Transplant(deleteNode, deleteNode.Right);
            }
            else if (deleteNode.Right == Leaf)
            {
                linkedNode = deleteNode.Left;
                Transplant(deleteNode, deleteNode.Left);
            }
            else
            {
                workNode = Minimum(deleteNode.Right);
                workNodeOriginalColor = workNode.Color;
                linkedNode            = workNode.Right;

                if (workNode.Parent == deleteNode)
                {
                    linkedNode.Parent = workNode;
                }
                else
                {
                    Transplant(workNode, workNode.Right);
                    workNode.Right        = deleteNode.Right;
                    workNode.Right.Parent = workNode;
                }
                Transplant(deleteNode, workNode);
                workNode.Left        = deleteNode.Left;
                workNode.Left.Parent = workNode;
                workNode.Color       = deleteNode.Color;
            }

            if (workNode.Color == Black)
            {
                DeleteFixup(linkedNode);
            }
        }
Exemple #3
0
        public RBTreeNode <TKey> GetNode(TKey key)
        {
            try
            {
                int hashKey            = key.GetHashCode();
                RBTreeNode <TKey> node = Root;

                do
                {
                    if (node.HashKey == hashKey)
                    {
                        return(node);
                    }
                    node = hashKey < node.HashKey ? node.Left : node.Right;
                } while (true);
            }
            catch (NullReferenceException)
            {
                throw new KeyNotFoundException("Key not found.");
            }
        }
Exemple #4
0
        private void Insert(RBTreeNode <TKey> node)
        {
            if (IsEmpty())
            {
                Root       = node;
                Root.Color = Black;
                return;
            }
            else
            {
                var workNode    = Leaf;
                var currentNode = Root;

                while (currentNode != Leaf)
                {
                    workNode    = currentNode;
                    currentNode = node.HashKey < currentNode.HashKey ? currentNode.Left : currentNode.Right;
                }
                node.Parent = workNode;
                if (node.HashKey < workNode.HashKey)
                {
                    workNode.Left = node;
                }
                else
                {
                    workNode.Right = node;
                }
                node.Left  = Leaf;
                node.Right = Leaf;
                node.Color = Red;
                if (node.Parent.Parent == null)
                {
                    return;
                }
                InsertFixup(node);
            }
        }
Exemple #5
0
        public void Add(TKey key)
        {
            RBTreeNode <TKey> newNode = RBTreeNode <TKey> .CreateNode(key, Red);

            Insert(newNode);
        }
Exemple #6
0
        private void DeleteFixup(RBTreeNode <TKey> linkedNode)
        {
            RBTreeNode <TKey> node;

            while (linkedNode != Root && linkedNode.Color == Black)
            {
                if (linkedNode == linkedNode.Parent.Left)
                {
                    node = linkedNode.Parent.Right;
                    if (node.Color == Red)
                    {
                        node.Color = Black;
                        linkedNode.Parent.Color = Red;
                        RotateLeft(linkedNode.Parent);
                        node = linkedNode.Parent.Right;
                    }
                    if (node.Left.Color == Black &&
                        node.Right.Color == Black)
                    {
                        node.Color = Red;
                        linkedNode = linkedNode.Parent;
                    }
                    else if (node.Right.Color == Black)
                    {
                        node.Left.Color = Black;
                        node.Color      = Red;
                        RotateRight(node);
                        node = node.Parent.Right;
                    }
                    node.Color        = linkedNode.Parent.Color;
                    node.Parent.Color = Black;
                    node.Right.Color  = Black;
                    RotateLeft(linkedNode.Parent);
                    linkedNode = Root;
                }
                else
                {
                    node = linkedNode.Parent.Left;
                    if (node.Color == Red)
                    {
                        node.Color = Black;
                        linkedNode.Parent.Color = Red;
                        RotateRight(linkedNode.Parent);
                        node = linkedNode.Parent.Left;
                    }
                    if (node.Right.Color == Black &&
                        node.Left.Color == Black)
                    {
                        node.Color = Red;
                        linkedNode = linkedNode.Parent;
                    }
                    else if (node.Left.Color == Black)
                    {
                        node.Right.Color = Black;
                        node.Color       = Red;
                        RotateLeft(node);
                        node              = node.Parent.Left;
                        node.Color        = linkedNode.Parent.Color;
                        node.Parent.Color = Black;
                        node.Left.Color   = Black;
                        RotateRight(linkedNode.Parent);
                        linkedNode = Root;
                    }
                }
            }
            linkedNode.Color = Black;
        }
Exemple #7
0
 public bool Contains(RBTreeNode <TKey> node)
 {
     return(ContainsKey(node.Key));
 }
Exemple #8
0
 public RBTree()
 {
     Leaf = new RBTreeNode <TKey>();
     Root = Leaf;
 }
 internal RBTreeNode()
 {
     Color  = Black;
     Parent = Left = Right = null;
 }