Ik ben bezig met het implementeren van een AVL Zoekboom. Tot dusver heb ik het coderende deel klaar en ik ben begonnen met het testen het voor bugs. Ik kwam erachter dat mijn knooppunt rotatie methoden worden afgeluisterd en in godsnaam Ik kan niet begrijpen wat is het probleem.
Het algoritme werkt zoals het zou moeten op papier, maar wanneer deze worden uitgevoerd op een machine het goed ... lekt boom knooppunten.
Deze methode wordt gebruikt om een knooppunt naar links te draaien: 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 mijn methode voor het invoegen merkte ik het AVL balanceren deel en in plaats daarvan Ik ben gewoon proberen om de nieuw ingevoegde knooppunt naar links te draaien. Het resultaat voor het invoegen van integers in oplopende volgorde: mijn boom bevat alleen de eerste root (eerste knooppunt geplaatst) en alle andere knooppunten zijn gelekt.
Alle hulp bij het identificeren van het probleem wordt zeer gewaardeerd als ik ben beginnen gek te gaan.
Voor de goede orde: als ik geen rotaties gebruik maken van de boom zal niet nodes lekken en het werkt als een normale ongebalanceerde binaire zoekboom (voor het inbrengen en lookup).
Edit: Door AJG85's opmerking die ik zal de opmerkingen toe te voegen:
Ik printf 'checks' toegevoegd aan de destructor methode van avl_search_tree :: avl_tree_node dat de sleutel-waarde (in mijn geval 32 bits gehele getallen) zal drukken voordat opruimen en om de insert methode van de avl_search_tree dat de sleutel gewoon ingebracht worden afgedrukt.
Toen in entrypoint van de programma's die ik toewijzen een avl_search_tree op de hoop en de toetsen toe te voegen in oplopende volgorde en vervolgens te verwijderen.
Met AVL Balancing ingeschakeld krijg ik de volgende output in de 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
Dat betekent thatall inserties waren succesvol, maar alleen de wortel is verwijderd.
Met de AVL Balancing uitgecommentarieerd het werkt als een normale binaire zoekboom. De terminal output is:
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
Dat betekent dat alles goed is opgeruimd.
Nu ... hoe heb ik tot de conclusie gekomen dat de rotatie methoden zijn de problemen? Onder gereageerd AVL balanceren subroutine een lijn die elke nieuw geplaatste knooppunt naar links roteert I toegevoegd. Het resultaat? Het zelfde als de AVL Balancing subroutine werd ingeschakeld.
En wat betreft de methode update_height (), Het is niet de structuur van de boom te veranderen in any way.
Ik hoop dat dit zal verduidelijken.
Probleem 2:
Om nog meer dingen te verduidelijken, zijn is hoe de avl_tree_node destructor is geïmplementeerd:
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 en _right_child zijn verwijzingen naar objecten op de heap toegewezen avl_tree_node.
Edit 3:
Dankzij 2e reactie AGJ85's vond ik de kwestie. In mijn rotate methoden vergat ik dat ik eigenlijk moet de boom root pointer updaten naar de nieuwe wortel wanneer de wortel werd verschoven.
In principe wortel van de boom werd altijd naar de eerste gestoken knooppunt en zonder het bijwerken van de wijzer als dat nodig is, zou mijn rotate methoden wortel van de nieuwe boom die eigenlijk recht is geconfigureerd lekken. :)
Dank je wel AGJ85!













