Пример #1
0
 private int getHeight(AVLNode a)
 {
     return(a == null ? 0 : a.height);
 }
Пример #2
0
        // метод добавления узла, принимает строку value
        public void insert(int value)
        {
            /* Если root = null, то создаем новый корневой узел */
            if (root == null)
            {
                root = new AVLNode(value);
                return;
            }
            // сравниваем текущее значение со значением корневого узла
            // и в соответствии с этим добавляем в левое или правое поддерево
            int compareResult = value.CompareTo(root.Value);

            if (compareResult < 0)
            {
                if (root.Left == null)
                {
                    root.Left = new AVLNode(value);
                }
                else
                {
                    root.Left.Value = value; // присваиваем значение
                }
                // проверяем балансировку
                // если высота левого дерева - высота правого дерева == 2 то
                if (getHeight(root.Left) - getHeight(root.Right) == 2)
                {
                    // если текущее значение меньше root.left.value
                    if (value.CompareTo(root.Left.Value) < 0)
                    {
                        // то выполняем одно вращение влево
                        singleRotation(root, 0);
                    }
                    else
                    {
                        // в противном случае выполняем 2 вращения влево
                        doubleRotation(root, 0);
                    }
                }
                // в противном случае если результат сравнения со значением корнегого узла >0
                else if (compareResult > 0)
                {
                    root.Right.Value = value; // присваиваем значение
                    // если высота правого - высота левого == 2
                    if (getHeight(root.Right) - getHeight(root.Left) == 2)
                    {
                        // если текущее значение меньше root.right.value
                        if (value.CompareTo(root.Right.Value) > 0)
                        {
                            root = singleRotation(root, 1);
                        }
                        else
                        {
                            root = doubleRotation(root, 1);
                        }
                    }
                }

                // высота дерева
                root.height = Math.Max(getHeight(root.Left), getHeight(root.Right)) + 1;
            }
        }