Ich habe die schwierigste Zeit herauszufinden, wie man einen AVL-Baum für meine Klasse ausbalanciert. Ich habe das Einfügen es mit diesem:Balancieren eines AVL-Baumes (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;
}
Mein Plan, die Anrufe zu haben war zu balancieren() überprüfen, um zu sehen, ob der Baum Bedürfnisse Ausgleich und dann je nach Bedarf ausgleichen. Das Problem ist, ich kann nicht einmal herausfinden, wie man den Baum durchquert, um den richtigen unausgeglichenen Knoten zu finden. Ich weiß, wie man den Baum rekursiv durchläuft, aber ich kann diesen Algorithmus nicht so übersetzen, dass er den niedrigsten unsymmetrischen Knoten findet. Ich habe auch Probleme beim Schreiben eines iterativen Algorithmus. Jede Hilfe wäre willkommen. :)
By the way, wenn Sie mit Java vertraut sind, 'für me' das Buch * Datenstrukturen und Algorithmen in Java, von Lafore * half mir viel zu Datenstrukturen verstehen. Obwohl es nicht AVL hat, spricht es ausführlich über Rot-Schwarz-Bäume, die "ich" leichter finde. Sobald Sie sie in Java verstehen, können Sie es in jeder anderen Sprache tun, mit der Sie vertraut sind, der ganze Punkt ist zu verstehen, wie sie funktionieren – Carlos
@Carlos: Ich stimme zu, solange die Sprache nicht kryptisch (perl ...) ist tun, um die Implementierung eines Algorithmus oder einer Datenstruktur zu demonstrieren. –