Lucrez la punerea în aplicare a unui căutare AVL copac. Până în prezent, am terminat partea de codificare și am început să-l testarea pentru bug-uri. Am aflat ca nodul meu metode de rotație sunt bugged și pentru numele lui Dumnezeu nu pot să înțeleg ce e problema.
Algoritmul funcționează așa cum trebuie pe hârtie, dar atunci când este executat pe o mașină de ea bine ... scurgeri de informații noduri de arbore.
Aceasta este metoda folosită pentru a roti un nod la stânga: 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;
}
În metoda mea de inserare am comentat AVL de echilibrare parte în schimb eu doar încerc să se rotească nodul nou inserat în stânga. Rezultatul pentru inserarea numere întregi în ordine crescătoare: copacul meu conține doar rădăcina inițială (primul nod inserat) și toate celelalte noduri sunt scurgeri.
Orice ajutor în identificarea problemei este foarte apreciat ca am început să merg nebun.
Pentru înregistrare: dacă nu folosesc nici un rotațiile copac nu se va scurge noduri și funcționează ca un arbore binar de căutare dezechilibrată normală (pentru inserare și de căutare).
Editare: Din cauza lui AJG85 comentariu Voi adăuga observațiile:
Am adăugat „controale“ printf la metoda destructor de avl_search_tree :: avl_tree_node care va imprima valoarea cheii (în cazul meu 32 de numere întregi de biți) înainte de curățare și, la metoda de inserție a avl_search_tree care va imprima cheia tocmai introdusă.
Apoi, în punctul de intrare a programului am aloca un avl_search_tree pe heap și adăugați-l cheile în ordine crescătoare și apoi ștergeți-l.
Cu AVL Echilibrare activat I a lua următoarea ieșire în 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
Ceea ce înseamnă că thatall inserții au avut succes, dar numai rădăcina a fost ștearsă.
Cu AVL de echilibrare a comentat faptul că funcționează ca un arbore binar de căutare normală. Ieșirea terminalului este:
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
Ceea ce înseamnă că totul este curățat în mod corespunzător în sus.
Acum ... Cum am ajuns la concluzia că metodele de rotație sunt problemele? Sub subrutina AVL de echilibrare a comentat, am adăugat o linie care se rotește în fiecare nod nou inserat în stânga. Rezultatul? La fel ca și în cazul în care subrutina AVL de echilibrare a fost activată.
Și în ceea ce privește metoda update_height (), nu modifică structura copacului în nici un fel.
Sper că acest lucru se va clarifica.
Edit 2:
Pentru a clarifica unele mai multe lucruri, lui este modul în care este pus în aplicare destructor avl_tree_node:
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 și _right_child sunt indicii pentru a avl_tree_node obiecte alocate pe movila.
Editare 3:
Datorită doilea comentariu AGJ85 lui am găsit problema. În metodele mele Alternați am uitat că am de fapt, să actualizeze indicatorul rădăcină de copac la rădăcină nouă ori de câte ori a fost mutat de la rădăcină.
Practic rădăcina copacului a fost întotdeauna îndreptat spre primul nod inserat și fără a actualiza indicatorul atunci când este necesar, metodele mele de rotire se va scurge rădăcină noul copac, care a fost de fapt configurat corect. :)
Vă mulțumim AGJ85!













