Пример #1
0
        /// <summary>
        /// Corects tree.
        /// </summary>
        /// <param name="node">Start fom this node.</param>
        private void RepairTree(AVLNode node)
        {
            AVLNode temp = node;

            //if (node == this.rootNode)
            //{
            //    return;
            //}



            while (temp.BalanceFactor <= 1 && temp.BalanceFactor >= -1)
            {
                if (temp.ParentNode != null)
                {
                    this.RepairTree(temp.ParentNode);
                }
                return;
            }

            if (temp.BalanceFactor > 1)
            {
                if (temp.LeftNode.BalanceFactor > -1)
                {
                    temp.RotateRight(this);
                    RepairTree(temp);
                    return;
                }

                temp.LeftNode.RotateLeft(this);
                temp.RotateRight(this);
                return;
            }

            if (temp.RightNode.BalanceFactor < 1)
            {
                temp.RotateLeft(this);
                return;
            }

            temp.RightNode.RotateRight(this);
            temp.RotateLeft(this);
            return;
        }
Пример #2
0
        public void RotateLeft_FullTree()
        {
            var node = new AVLNode <int>(100);

            node.Left  = new AVLNode <int>(50);
            node.Right = new AVLNode <int>(150);

            node.Left.Left   = new AVLNode <int>(25);
            node.Left.Right  = new AVLNode <int>(75);
            node.Right.Left  = new AVLNode <int>(125);
            node.Right.Right = new AVLNode <int>(175);

            node = node.RotateLeft();

            Assert.AreEqual <int>(150, node.Value);
            Assert.AreEqual <int>(175, node.Right.Value);
            Assert.AreEqual <int>(100, node.Left.Value);
            Assert.AreEqual <int>(125, node.Left.Right.Value);
            Assert.AreEqual <int>(50, node.Left.Left.Value);
            Assert.AreEqual <int>(25, node.Left.Left.Left.Value);
            Assert.AreEqual <int>(75, node.Left.Left.Right.Value);
        }
Пример #3
0
        public void RotateLeft_FullTree()
        {
            var node = new AVLNode<int>(100);

            node.Left = new AVLNode<int>(50);
            node.Right = new AVLNode<int>(150);

            node.Left.Left = new AVLNode<int>(25);
            node.Left.Right = new AVLNode<int>(75);
            node.Right.Left = new AVLNode<int>(125);
            node.Right.Right = new AVLNode<int>(175);

            node = node.RotateLeft();

            Assert.AreEqual<int>(150, node.Value);
            Assert.AreEqual<int>(175, node.Right.Value);
            Assert.AreEqual<int>(100, node.Left.Value);
            Assert.AreEqual<int>(125, node.Left.Right.Value);
            Assert.AreEqual<int>(50, node.Left.Left.Value);
            Assert.AreEqual<int>(25, node.Left.Left.Left.Value);
            Assert.AreEqual<int>(75, node.Left.Left.Right.Value);
        }
Пример #4
0
        /// <summary>
        /// Removes the elemet from tree.
        /// </summary>
        /// <param name="item">Key Value pair of the elemet.</param>
        /// <returns>True if removed.</returns>
        public bool Remove(KeyValuePair <TKey, TValue> item)
        {
            AVLNode temp = this.rootNode;

            while (temp != null)
            {
                switch (item.Key.CompareTo(temp.NodeKey))
                {
                case -1:
                    temp = temp.LeftNode;
                    break;

                case 1:
                    temp = temp.RightNode;
                    break;

                default:
                {
                    if (temp.IsLeaf)
                    {
                        if (temp.ParentNode.LeftNode == temp)
                        {
                            temp.ParentNode.LeftNode = null;
                            this.RepairTree(temp.ParentNode);
                            nodeCount--;
                            isModfied = true;
                            return(true);
                        }
                        temp.ParentNode.RightNode = null;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                    else if (temp.LeftNode == null)
                    {
                        temp.RightNode.ParentNode = temp.ParentNode;
                        if (temp.ParentNode.LeftNode == temp)
                        {
                            temp.ParentNode.LeftNode = temp.RightNode;
                            this.RepairTree(temp.ParentNode);
                            nodeCount--;
                            isModfied = true;
                            return(true);
                        }
                        temp.ParentNode.RightNode = null;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                    else if (temp.RightNode == null)
                    {
                        temp.LeftNode.ParentNode = temp.ParentNode;
                        if (temp.ParentNode.LeftNode == temp)
                        {
                            temp.ParentNode.LeftNode = temp.LeftNode;
                            this.RepairTree(temp.ParentNode);
                            nodeCount--;
                            isModfied = true;
                            return(true);
                        }
                        temp.ParentNode.RightNode = null;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                    else
                    {
                        temp.RotateLeft(this);
                        temp.ParentNode.LeftNode = temp.LeftNode;
                        temp.LeftNode.ParentNode = temp.ParentNode;
                        this.RepairTree(temp.ParentNode);
                        nodeCount--;
                        isModfied = true;
                        return(true);
                    }
                }
                }
            }
            return(false);
        }