Согласно моему пониманию дерева AVL, для каждого узла высота левого и правого поддеревьев должна отличаться не более чем на 1.
Вот код, который я придумал, чтобы сбалансировать высоту при вставке нового узла. Следующий метод будет выполняться многократно, начиная с нового узла, распространяющегося вверх до корня
private Node balance(Node x) {
if (Math.abs(height(x.left) - height(x.right)) <= 1) {
return x;
}
// left sub tree is heavier than right sub tree
if (height(x.left) > height(x.right)) {
// right sub tree of left sub tree is heavier than left sub tree of left sub tree
if (height(x.left.left) < height(x.left.right)) {
leftRotate(x.left);
}
return rightRotate(x);
}
// right sub tree is heavier than left sub tree
else {
// left sub tree of right sub tree is heavier than right sub tree of right sub tree
if (height(x.right.left) > height(x.right.right)) {
rightRotate(x.right);
}
return leftRotate(x);
}
}
Когда я смотрел на решения MIT (стр. 5) , кажется, что они выполняют вращение влево и затем вращение вправо, если узел вставлен в левое поддерево левого поддерева несбалансированного узла:
Согласно моему пониманию, если мы вставим узел в левое поддерево левого поддерева неуравновешенного узла, нам следует только вращение вправо, а не вращение влево и последующее вращение вправо.
Что мне здесь не хватает? Правильно ли я это реализовал?