Je travaille sur une affectation qui me demande d'implémenter un arbre AVL. Je suis sûr que j'ai les méthodes de rotation correctes, mais j'ai du mal à déterminer quand les utiliser. Par exemple, l'explication dans le livre dit que je devrais monter le même chemin que je suis descendu pour insérer le nœud/l'élément. Cependant, je ne peux pas avoir de pointeurs parent.Équilibrage d'arbre AVL
dernier code:
public BinaryNode<T> insert(BinaryNode<T> node) {
if (this.getElement().compareTo(node.getElement()) > 0) {
if (this.getLeftChild() != null) {
BinaryNode<T> b = this.getLeftChild().insert(node);
if(!this.isBalanced()) {
this.balance();
}
return b;
} else {
this.setLeftChild(node);
}
} else if (this.getElement().compareTo(node.getElement()) < 0) {
if (this.getRightChild() != null) {
return this.getRightChild().insert(node);
} else {
this.setRightChild(node);
}
}
return this;
}
Ce que je veux faire ici est remontons l'arbre, mais il ne peut vérifier l'équilibre après qu'il insère le nœud. Par conséquent, ceci étant dans la clause else.
J'ai également essayé de mettre le code de la balance où R Samuel Klatchko a suggéré, mais j'ai vérifié la balance sur chaque insert. Par exemple: Si l'on insère consécutivement 7, 9, 5, 3 et 1, j'obtiens une exception de pointeur nul lorsque j'essaie d'insérer 1.
EDIT: Une des raisons de ce qui précède peut être liée à la façon dont je faisait la hauteur. Cela fonctionne bien avec une seule rotation à droite si je calcule la hauteur à chaque fois avec height() mais cela casse le temps O (log (n)) d'un arbre AVL.
Des idées sur la façon d'accomplir cela?
Donc, est-ce là où je devrais mettre mon algorithme d'équilibrage? Pas juste après que j'insère réellement le noeud? Je pense que ma confusion vient d'un manque de compréhension de la récursivité qui se produit ici. –
J'ai donc essayé une implémentation similaire à celle ci-dessus et il vérifie l'équilibre en montant et en descendant. Y a-t-il un moyen de vérifier cela seulement en montant? –
S'il vous plaît mettre à jour la question avec votre dernier code (et ajouter un commentaire afin que je sache quand revoir). –