Exemple #1
0
        //================================================================================
        private CajAvlTreeNode Balance()
        {
            this.FixHeight();

            int bf = GetBalanceFactor();

            CajAvlTreeNode rotated = null;

            if (bf == 2)
            {
                if (right.GetBalanceFactor() < 0)
                {
                    right = right.RotateRight();
                }
                rotated = this.RotateLeft();
            }
            else if (bf == -2)
            {
                if (left.GetBalanceFactor() > 0)
                {
                    left = left.RotateLeft();
                }
                rotated = this.RotateRight();
            }

            if (rotated != null)
            {
                return(rotated);
            }

            return(this);
        }
Exemple #2
0
        //================================================================================
        private CajAvlTreeNode Insert(long key, CajAvlTreeNode node)
        {
            if (node == null)
            {
                CajAvlTreeNode newNode = new CajAvlTreeNode();
                newNode.key = key;
                return(newNode);
            }

            if (key < node.key)
            {
                node.left = Insert(key, node.left);
            }
            else
            {
                if (isUniqueKeys && key == node.key)
                {
                    //throw exception?
                }
                else
                {
                    node.right = Insert(key, node.right);
                }
            }

            node = node.Balance();
            return(node);
        }
Exemple #3
0
        //================================================================================
        ///most right
        public CajAvlTreeNode GetMax(CajAvlTreeNode startNode = null)
        {
            if (startNode == null)
            {
                return(right != null ? GetMax(right) : this);
            }

            return(startNode.right != null ? GetMax(startNode.right) : startNode);
        }
Exemple #4
0
        //================================================================================
        ///most left
        public CajAvlTreeNode GetMin(CajAvlTreeNode startNode = null)
        {
            if (startNode == null)
            {
                return(left != null ? GetMin(left) : this);
            }

            return(startNode.left != null ? GetMin(startNode.left) : startNode);
        }
Exemple #5
0
        //================================================================================
        private CajAvlTreeNode DeleteMin(CajAvlTreeNode node)
        {
            if (node.left == null)
            {
                return(node.right);
            }
            node.left = DeleteMin(node.left);

            node = node.Balance();
            return(node);
        }
Exemple #6
0
        //================================================================================
        private CajAvlTreeNode RotateRight()
        {
            CajAvlTreeNode q = this.left;

            this.left = q.right;
            q.right   = this;

            this.FixHeight();
            q.FixHeight();

            return(q);
        }
Exemple #7
0
        //================================================================================
        private CajAvlTreeNode RotateLeft()
        {
            CajAvlTreeNode p = this.right;

            this.right = p.left;
            p.left     = this;

            this.FixHeight();
            p.FixHeight();

            return(p);
        }
Exemple #8
0
        //================================================================================
        private void TraverseLCR(Action <CajAvlTreeNode> callback, CajAvlTreeNode node)
        {
            if (node.left != null)
            {
                TraverseLCR(callback, node.left);
            }

            callback(node);

            if (node.right != null)
            {
                TraverseLCR(callback, node.right);
            }
        }
Exemple #9
0
        //================================================================================
        ///creates an incorrect tree. Useless and absurd. Just for tests and Google Team:
        public void Inverse(CajAvlTreeNode startNode = null)
        {
            if (startNode == null)
            {
                Inverse(this);
                return;
            }

            if (startNode.left != null)
            {
                Inverse(startNode.left);
            }
            if (startNode.right != null)
            {
                Inverse(startNode.right);
            }

            CajAvlTreeNode tmp = startNode.right;

            startNode.right = startNode.left;
            startNode.left  = tmp;
        }
Exemple #10
0
        //================================================================================
        public void CopyFrom(CajAvlTreeNode node)
        {
            CajAvlTreeNode newLeft = null;

            if (node.left != null)
            {
                newLeft = new CajAvlTreeNode();
                newLeft.CopyFrom(node.left);
            }

            CajAvlTreeNode newRight = null;

            if (node.right != null)
            {
                newRight = new CajAvlTreeNode();
                newRight.CopyFrom(node.right);
            }

            this.key    = node.key;
            this.height = node.height;
            this.left   = newLeft;
            this.right  = newRight;
        }
Exemple #11
0
        //================================================================================
        private CajAvlTreeNode Delete(int key, CajAvlTreeNode node)
        {
            if (node == null)
            {
                return(null);
            }

            if (key < node.key)
            {
                node.left = Delete(key, node.left);
            }
            else if (key > node.key)
            {
                node.right = Delete(key, node.right);
            }
            else
            {
                CajAvlTreeNode q = node.left;
                CajAvlTreeNode r = node.right;

                if (r == null)
                {
                    return(q);
                }

                CajAvlTreeNode min = r.GetMin();
                min.right = r.DeleteMin(r);
                min.left  = q;

                min = min.Balance();
                return(min);
            }

            node = node.Balance();
            return(node);
        }
Exemple #12
0
 //================================================================================
 public CajAvlTreeNode(CajAvlTreeNode copy)
 {
     CopyFrom(copy);
 }