示例#1
0
        public IComparable GetMaxKey()
        {
            OrderedTreeNode treeNode = rbTree;

            if (treeNode == null || treeNode == sentinelNode)
            {
                throw(new InvalidOperationException("Tree is empty"));
            }


            while (treeNode.Right != sentinelNode)
            {
                treeNode = treeNode.Right;
            }

            lastNodeFound = treeNode;

            return(treeNode.Key);
        }
示例#2
0
        public void RotateRight(OrderedTreeNode x)
        {
            OrderedTreeNode y = x.Left;


            x.Left = y.Right;


            if (y.Right != sentinelNode)
            {
                y.Right.Parent = x;
            }

            if (y != sentinelNode)
            {
                y.Parent = x.Parent;
            }

            if (x.Parent != null)
            {
                if (x == x.Parent.Right)
                {
                    x.Parent.Right = y;
                }
                else
                {
                    x.Parent.Left = y;
                }
            }
            else
            {
                rbTree = y;
            }


            y.Right = x;
            if (x != sentinelNode)
            {
                x.Parent = y;
            }
        }
示例#3
0
        public void Reset()
        {
            pre = true;
            stack.Clear();


            if (ascending)
            {
                while (tnode != sentinelNode)
                {
                    stack.Push(tnode);
                    tnode = tnode.Left;
                }
            }
            else
            {
                while (tnode != sentinelNode)
                {
                    stack.Push(tnode);
                    tnode = tnode.Right;
                }
            }
        }
示例#4
0
        public bool ContainsKey(IComparable key)
        {
            OrderedTreeNode treeNode = rbTree;
            int             result   = 0;

            while (treeNode != sentinelNode)
            {
                result = key.CompareTo(treeNode.Key);
                if (result == 0)
                {
                    lastNodeFound = treeNode;
                    return(true);
                }
                if (result < 0)
                {
                    treeNode = treeNode.Left;
                }
                else
                {
                    treeNode = treeNode.Right;
                }
            }
            return(false);
        }
示例#5
0
        public void Add(IComparable key, object data)
        {
            if (key == null)
            {
                throw(new ArgumentNullException("Key is null"));
            }


            int result = 0;

            OrderedTreeNode node = new OrderedTreeNode();
            OrderedTreeNode temp = rbTree;

            while (temp != sentinelNode)
            {
                node.Parent = temp;
                result      = key.CompareTo(temp.Key);
                if (result == 0)
                {
                    throw new ArgumentException("Key duplicated");
                }
                if (result > 0)
                {
                    temp = temp.Right;
                }
                else
                {
                    temp = temp.Left;
                }
            }


            node.Key   = key;
            node.Data  = data;
            node.Left  = sentinelNode;
            node.Right = sentinelNode;


            if (node.Parent != null)
            {
                result = node.Key.CompareTo(node.Parent.Key);
                if (result > 0)
                {
                    node.Parent.Right = node;
                }
                else
                {
                    node.Parent.Left = node;
                }
            }
            else
            {
                rbTree = node;
            }

            RestoreAfterInsert(node);

            lastNodeFound = node;

            intCount = intCount + 1;
        }
示例#6
0
        public object NextElement()
        {
            if (stack.Count == 0)
            {
                throw new InvalidOperationException("Element not found");
            }



            OrderedTreeNode node = (OrderedTreeNode)stack.Peek();

            if (ascending)
            {
                if (node.Right == sentinelNode)
                {
                    OrderedTreeNode tn = (OrderedTreeNode)stack.Pop();


                    while (HasMoreElements() && ((OrderedTreeNode)stack.Peek()).Right == tn)
                    {
                        tn = (OrderedTreeNode)stack.Pop();
                    }
                }
                else
                {
                    OrderedTreeNode tn = node.Right;
                    while (tn != sentinelNode)
                    {
                        stack.Push(tn);
                        tn = tn.Left;
                    }
                }
            }
            else
            {
                if (node.Left == sentinelNode)
                {
                    OrderedTreeNode tn = (OrderedTreeNode)stack.Pop();
                    while (HasMoreElements() && ((OrderedTreeNode)stack.Peek()).Left == tn)
                    {
                        tn = (OrderedTreeNode)stack.Pop();
                    }
                }
                else
                {
                    OrderedTreeNode tn = node.Left;
                    while (tn != sentinelNode)
                    {
                        stack.Push(tn);
                        tn = tn.Right;
                    }
                }
            }


            Key   = node.Key;
            Value = node.Data;


            return(keys == true ? node.Key : node.Data);
        }
示例#7
0
 public OrderedTreeEnumerator(OrderedTreeNode tnode, bool keys, bool ascending, OrderedTreeNode sentinelNode)
 {
     this.sentinelNode = sentinelNode;
     stack             = new Stack();
     this.keys         = keys;
     this.ascending    = ascending;
     this.tnode        = tnode;
     Reset();
 }
示例#8
0
 public void Clear()
 {
     rbTree   = sentinelNode;
     intCount = 0;
 }
示例#9
0
        private void RestoreAfterDelete(OrderedTreeNode x)
        {
            OrderedTreeNode y;

            while (x != rbTree && x.Color == OrderedTreeNode.BLACK)
            {
                if (x == x.Parent.Left)
                {
                    y = x.Parent.Right;
                    if (y.Color == OrderedTreeNode.RED)
                    {
                        y.Color        = OrderedTreeNode.BLACK;
                        x.Parent.Color = OrderedTreeNode.RED;
                        RotateLeft(x.Parent);
                        y = x.Parent.Right;
                    }
                    if (y.Left.Color == OrderedTreeNode.BLACK &&
                        y.Right.Color == OrderedTreeNode.BLACK)
                    {
                        y.Color = OrderedTreeNode.RED;
                        x       = x.Parent;
                    }
                    else
                    {
                        if (y.Right.Color == OrderedTreeNode.BLACK)
                        {
                            y.Left.Color = OrderedTreeNode.BLACK;
                            y.Color      = OrderedTreeNode.RED;
                            RotateRight(y);
                            y = x.Parent.Right;
                        }
                        y.Color        = x.Parent.Color;
                        x.Parent.Color = OrderedTreeNode.BLACK;
                        y.Right.Color  = OrderedTreeNode.BLACK;
                        RotateLeft(x.Parent);
                        x = rbTree;
                    }
                }
                else
                {
                    y = x.Parent.Left;
                    if (y.Color == OrderedTreeNode.RED)
                    {
                        y.Color        = OrderedTreeNode.BLACK;
                        x.Parent.Color = OrderedTreeNode.RED;
                        RotateRight(x.Parent);
                        y = x.Parent.Left;
                    }
                    if (y.Right.Color == OrderedTreeNode.BLACK &&
                        y.Left.Color == OrderedTreeNode.BLACK)
                    {
                        y.Color = OrderedTreeNode.RED;
                        x       = x.Parent;
                    }
                    else
                    {
                        if (y.Left.Color == OrderedTreeNode.BLACK)
                        {
                            y.Right.Color = OrderedTreeNode.BLACK;
                            y.Color       = OrderedTreeNode.RED;
                            RotateLeft(y);
                            y = x.Parent.Left;
                        }
                        y.Color        = x.Parent.Color;
                        x.Parent.Color = OrderedTreeNode.BLACK;
                        y.Left.Color   = OrderedTreeNode.BLACK;
                        RotateRight(x.Parent);
                        x = rbTree;
                    }
                }
            }
            x.Color = OrderedTreeNode.BLACK;
        }
示例#10
0
        private void Delete(OrderedTreeNode z)
        {
            OrderedTreeNode x = new OrderedTreeNode();
            OrderedTreeNode y;



            if (z.Left == sentinelNode || z.Right == sentinelNode)
            {
                y = z;
            }
            else
            {
                y = z.Right;
                while (y.Left != sentinelNode)
                {
                    y = y.Left;
                }
            }



            if (y.Left != sentinelNode)
            {
                x = y.Left;
            }
            else
            {
                x = y.Right;
            }



            x.Parent = y.Parent;
            if (y.Parent != null)
            {
                if (y == y.Parent.Left)
                {
                    y.Parent.Left = x;
                }
                else
                {
                    y.Parent.Right = x;
                }
            }
            else
            {
                rbTree = x;
            }



            if (y != z)
            {
                z.Key  = y.Key;
                z.Data = y.Data;
            }

            if (y.Color == OrderedTreeNode.BLACK)
            {
                RestoreAfterDelete(x);
            }

            lastNodeFound = sentinelNode;
        }
示例#11
0
        public object this[IComparable key] {
            get {
                return(GetData(key));
            }
            set {
                if (key == null)
                {
                    throw new ArgumentNullException("Key is null");
                }


                int result = 0;

                OrderedTreeNode node = new OrderedTreeNode();
                OrderedTreeNode temp = rbTree;

                while (temp != sentinelNode)
                {
                    node.Parent = temp;
                    result      = key.CompareTo(temp.Key);
                    if (result == 0)
                    {
                        lastNodeFound = temp;
                        temp.Data     = value;
                        return;
                    }
                    if (result > 0)
                    {
                        temp = temp.Right;
                    }
                    else
                    {
                        temp = temp.Left;
                    }
                }


                node.Key   = key;
                node.Data  = value;
                node.Left  = sentinelNode;
                node.Right = sentinelNode;


                if (node.Parent != null)
                {
                    result = node.Key.CompareTo(node.Parent.Key);
                    if (result > 0)
                    {
                        node.Parent.Right = node;
                    }
                    else
                    {
                        node.Parent.Left = node;
                    }
                }
                else
                {
                    rbTree = node;
                }

                RestoreAfterInsert(node);

                lastNodeFound = node;

                intCount = intCount + 1;
            }
        }