private int getHeight(AVLNode a) { return(a == null ? 0 : a.height); }
// метод добавления узла, принимает строку 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; } }