Я думаю, что обычная реализация для дерева AVL хранит высоту узла в самом узле и обновляется в операциях вставки, вырезания и связывания. После этих операций мы должны проверить, верна ли высота верхних вершин, примерно так:
/**
* Recursively updates heights starting with given node.
* If height of given node is already correct we know
* that we can stop.
*/
private void updateHeights(AvlNode<T> node){
if(node == null) return;
int heightLeft = node.left != null ? node.left.height : -1;
int heightRight = node.right != null ? node.right.height : -1;
int height = heightLeft > heightRight ? heightLeft + 1 : heightRight + 1;
if(node.height != height){
node.height = height;
updateHeights(node.parent);
}
}
Это всегда вызывается у родителя самого измененного узла, так сказать. Ах, старые добрые времена - реализация дерева AVL - это забавный маленький проект - удачи .. и тщательно протестируйте его!