Ich arbeite einen AVL Suchbaum an der Umsetzung. Bisher habe ich die Codierung Teil beendet, und ich habe angefangen, es für Bugs zu testen. Ich fand heraus, dass meine Knoten Rotationsverfahren abgehört werden und um Gottes willen kann ich nicht verstehen, was das Problem ist.
Der Algorithmus funktioniert, wie es auf dem Papier soll aber, wenn es ... leckt Knoten Baum gut auf einer Maschine ausgeführt.
Dies ist die Methode verwendet , um einen Knoten nach links zu drehen: http://pastebin.com/mPHj29Af
bool avl_search_tree::avl_tree_node::rotate_left()
{
if (_right_child != NULL) {
avl_tree_node *new_root = _right_child;
if (_parent != NULL) {
if (_parent->_left_child == this) {
_parent->_left_child = new_root;
} else {
_parent->_right_child = new_root;
}
}
new_root->_parent = _parent;
_parent = new_root;
_right_child = new_root->_left_child;
new_root->_left_child = this;
if (_right_child != NULL) {
_right_child->_parent = this;
}
//update heights
update_height();
new_root->update_height();
return true;
}
return false;
}
In meinem Einfügemethode kommentierte ich die AVL Teil ausgleichend und stattdessen versuche ich gerade den neu eingefügten Knoten nach links zu drehen. Das Ergebnis für ganze Zahlen in aufsteigender Reihenfolge eingefügt: mein Baum enthält nur die anfängliche Wurzel (erste Knoten eingefügt) und alle anderen Knoten durchgesickert sind.
Jede Hilfe, um das Problem zu identifizieren ist sehr geschätzt, wie ich fange an, verrückt zu werden.
Für das Protokoll: Wenn ich den Baum keine Rotationen verwenden, nicht Knoten auslaufen und es funktioniert wie ein normalen unausgeglichen binärer Suchbaum (zum Einfügen und Lookup).
Edit: Aufgrund AJG85 Kommentars werde ich die Beobachtungen hinzu:
Ich fügte hinzu, printf Checks zum Destruktormethode von avl_search_tree :: avl_tree_node, die den Schlüsselwert gedruckt werden (in meinem Fall 32-Bit-Integer) vor Bereinigung und die insert-Methode des avl_search_tree, die den Schlüssel gedruckt werden nur eingefügt.
Dann in dem Einstiegspunkt des Programms zuweisen ich eine avl_search_tree auf dem Heap und fügen Sie Schlüssel, um es in aufsteigender Reihenfolge und dann löschen.
Mit AVL Balancing aktiviert bekomme ich die folgende Ausgabe im Terminal:
bool avl_search_tree::insert(const int&) : 1
bool avl_search_tree::insert(const int&) : 2
bool avl_search_tree::insert(const int&) : 3
bool avl_search_tree::insert(const int&) : 4
bool avl_search_tree::insert(const int&) : 5
bool avl_search_tree::insert(const int&) : 6
bool avl_search_tree::insert(const int&) : 7
bool avl_search_tree::insert(const int&) : 8
avl_search_tree::avl_tree_node::~avl_tree_node() : 1
Was bedeutet, daßalle Einfügungen waren erfolgreich, aber nur die Wurzel gelöscht wurde.
Mit dem AVL out kommentierte Balancing funktioniert es wie ein normaler binärer Suchbaum. Das Terminal ausgegeben wird:
bool avl_search_tree::insert(const int&) : 1
bool avl_search_tree::insert(const int&) : 2
bool avl_search_tree::insert(const int&) : 3
bool avl_search_tree::insert(const int&) : 4
bool avl_search_tree::insert(const int&) : 5
bool avl_search_tree::insert(const int&) : 6
bool avl_search_tree::insert(const int&) : 7
bool avl_search_tree::insert(const int&) : 8
avl_search_tree::avl_tree_node::~avl_tree_node() : 1
avl_search_tree::avl_tree_node::~avl_tree_node() : 2
avl_search_tree::avl_tree_node::~avl_tree_node() : 3
avl_search_tree::avl_tree_node::~avl_tree_node() : 4
avl_search_tree::avl_tree_node::~avl_tree_node() : 5
avl_search_tree::avl_tree_node::~avl_tree_node() : 6
avl_search_tree::avl_tree_node::~avl_tree_node() : 7
avl_search_tree::avl_tree_node::~avl_tree_node() : 8
Was bedeutet, dass alles richtig aufgeräumt wird.
Nun ... wie kam ich zu dem Schluss, dass die Rotationsverfahren sind die Themen? Unter dem AVL-Balancing Subroutine kommentiert habe ich eine Linie, die jeden neu eingefügten Knoten nach links dreht. Das Ergebnis? Das gleiche wie wenn das AVL Balancing Unterprogramm aktiviert wurde.
Und in Bezug auf die update_height () -Methode, ist es nicht die Struktur des Baumes verändert in keiner Weise.
Ich hoffe, das es zu klären.
Edit 2:
Um einige weitere Dinge zu klären, ist sein wie die avl_tree_node destructor implementiert:
avl_search_tree::avl_tree_node::~avl_tree_node()
{
printf(%s : %d\n, __PRETTY_FUNCTION__, *_key);
if (_left_child != NULL) {
delete _left_child;
}
if (_right_child != NULL) {
delete _right_child;
}
if (_key != NULL) {
delete _key;
}
}
_left_child und _right_child sind Zeiger Objekte auf dem Heap zugewiesen avl_tree_node.
Bearbeiten 3:
Dank AGJ85 der zweiten Kommentar fand ich das Problem. In meiner dreht Methode habe ich vergessen, dass ich eigentlich die Wurzel Zeiger auf die neue Wurzel des Baumes zu aktualisieren, wenn die Wurzel verschoben wurde.
Grundsätzlich ist die Wurzel des Baums zeigte immer auf den ersten Knoten eingefügt und ohne den Zeiger zu aktualisieren, wenn nötig, meine rotate Methoden würden die neue Baumwurzel auslaufen, die tatsächlich richtige konfiguriert wurde. :)
Danke AGJ85!













