Sto provando il momento più difficile cercando di capire come bilanciare un albero AVL per la mia classe. Ce l'ho Caricamento con questo:bilanciamento di un albero AVL (C++)
Node* Tree::insert(int d)
{
cout << "base insert\t" << d << endl;
if (head == NULL)
return (head = new Node(d));
else
return insert(head, d);
}
Node* Tree::insert(Node*& current, int d)
{
cout << "insert\t" << d << endl;
if (current == NULL)
current = new Node(d);
else if (d < current->data) {
insert(current->lchild, d);
if (height(current->lchild) - height(current->rchild)) {
if (d < current->lchild->getData())
rotateLeftOnce(current);
else
rotateLeftTwice(current);
}
}
else if (d > current->getData()) {
insert(current->rchild, d);
if (height(current->rchild) - height(current->lchild)) {
if (d > current->rchild->getData())
rotateRightOnce(current);
else
rotateRightTwice(current);
}
}
return current;
}
Il mio piano era quello di avere le chiamate per bilanciare() controllare per vedere se le esigenze degli alberi di bilanciamento e quindi l'equilibrio, se necessario. Il problema è che non riesco nemmeno a capire come attraversare l'albero per trovare il nodo sbilanciato corretto. So come attraversare l'albero in modo ricorsivo, ma non riesco a tradurre quell'algoritmo nel trovare il nodo meno equilibrato. Sto anche avendo problemi a scrivere un algoritmo iterativo. Qualsiasi aiuto sarebbe apprezzato. :)
A proposito, se si ha familiarità con Java, 'per me' il libro * strutture dati e algoritmi in Java, da Lafore * mi ha aiutato molto a capire le strutture dati Anche se non ha AVL, parla molto degli alberi Red-Black, che "i" se trovano più facile. Una volta che li hai capiti in Java puoi farlo in qualsiasi altra lingua che conosci, l'intero punto è capire come funzionano – Carlos
@Carlos: Sono d'accordo che finché la lingua non è criptica (perl ...) farà per dimostrare l'implementazione di un algoritmo o di una struttura dati. –