Exemple #1
0
        AvlBinaryTreeNode <T> Remove(AvlBinaryTreeNode <T> node, T key) // удаление ключа key из дерева node
        {
            if (node == null)
            {
                return(null);
            }
            var comp = comparer.Compare(key, node.Key);

            if (comp < 0)
            {
                node.Left = Remove(node.Left, key);
            }
            else if (comp > 0)
            {
                node.Right = Remove(node.Right, key);
            }
            else //  k == p->key
            {
                var left  = node.Left;
                var right = node.Right;
                wasRemoved = true;
                //delete p;
                if (right == null)
                {
                    return(left);
                }
                var min = FindMin(right);
                min.Right = RemoveMin(right);
                min.Left  = left;
                return(Balance(min));
            }
            return(Balance(node));
        }
Exemple #2
0
        void FixHeight(AvlBinaryTreeNode <T> node)
        {
            var heightLeft  = GetHeight(node.Left);
            var heightRight = GetHeight(node.Right);

            node.Height  = heightLeft > heightRight ? heightLeft : heightRight;
            node.Height += 1;
        }
Exemple #3
0
 // private methods...
 byte GetHeight(AvlBinaryTreeNode <T> node)
 {
     if (node != null)
     {
         return(node.Height);
     }
     return(0);
 }
Exemple #4
0
 // public methods...
 public void Add(T item)
 {
     wasInserted = false;
     root        = Insert(root, item);
     if (wasInserted)
     {
         count++;
     }
 }
Exemple #5
0
 AvlBinaryTreeNode <T> RemoveMin(AvlBinaryTreeNode <T> node) // удаление узла с минимальным ключом из дерева node
 {
     if (node.Left == null)
     {
         return(node.Right);
     }
     node.Left = RemoveMin(node.Left);
     return(Balance(node));
 }
Exemple #6
0
        AvlBinaryTreeNode <T> RotateLeft(AvlBinaryTreeNode <T> node) // левый поворот
        {
            var temp = node.Right;

            node.Right = temp.Left;
            temp.Left  = node;
            FixHeight(node);
            FixHeight(temp);
            return(temp);
        }
Exemple #7
0
 public bool Remove(T item)
 {
     wasRemoved = false;
     root       = Remove(root, item);
     if (wasRemoved)
     {
         count--;
     }
     return(wasRemoved);
 }
Exemple #8
0
        AvlBinaryTreeNode <T> FindNode(AvlBinaryTreeNode <T> rootNode, T key)
        {
            if (rootNode == null)
            {
                return(null);
            }
            var comp = comparer.Compare(key, rootNode.Key);

            if (comp == 0)
            {
                return(rootNode);
            }
            if (comp < 0)
            {
                return(FindNode(rootNode.Left, key));
            }
            return(FindNode(rootNode.Right, key));
        }
Exemple #9
0
 AvlBinaryTreeNode <T> Balance(AvlBinaryTreeNode <T> node)
 {
     FixHeight(node);
     if (BalanceFactor(node) == 2)
     {
         if (BalanceFactor(node.Right) < 0)
         {
             node.Right = RotateRight(node.Right);
         }
         return(RotateLeft(node));
     }
     if (BalanceFactor(node) == -2)
     {
         if (BalanceFactor(node.Left) > 0)
         {
             node.Left = RotateLeft(node.Left);
         }
         return(RotateRight(node));
     }
     return(node); // балансировка не нужна
 }
Exemple #10
0
        AvlBinaryTreeNode <T> Insert(AvlBinaryTreeNode <T> root, T key) // вставка ключа k в дерево с корнем root
        {
            if (root == null)
            {
                wasInserted = true;
                return(new AvlBinaryTreeNode <T>(key));
            }
            var comp = comparer.Compare(key, root.Key);

            if (comp < 0 /*k < p->key*/)
            {
                root.Left = Insert(root.Left, key);
            }
            else if (comp > 0)
            {
                root.Right = Insert(root.Right, key);
            }
            else
            {
                return(root);
            }
            return(Balance(root));
        }
Exemple #11
0
 int BalanceFactor(AvlBinaryTreeNode <T> node)
 {
     return(GetHeight(node.Right) - GetHeight(node.Left));
 }
Exemple #12
0
 public void Clear()
 {
     root  = null;
     count = 0;
 }
Exemple #13
0
 AvlBinaryTreeNode <T> FindMin(AvlBinaryTreeNode <T> node) // поиск узла с минимальным ключом в дереве node
 {
     return(node.Left != null?FindMin(node.Left) : node);
 }