मैं एक AVL खोजें पेड़ लागू करने पर काम कर रहा हूँ। अब तक मैं कोडिंग हिस्सा समाप्त हो गया है और मैं कीड़े के लिए परीक्षण शुरू कर दिया है। मुझे पता चला कि मेरी नोड रोटेशन तरीकों bugged रहे हैं और भगवान की खातिर मैं नहीं समझ सकता समस्या क्या।
एल्गोरिथ्म के रूप में यह कागज पर होना चाहिए, लेकिन जब एक मशीन पर निष्पादित यह अच्छी तरह से ... लीक पेड़ नोड्स काम करता है।
यह बाईं ओर एक नोड बारी बारी से करने के लिए इस्तेमाल विधि है: 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;
}
मेरी प्रविष्टि विधि में मैं हिस्सा संतुलन AVL टिप्पणी की है और बजाय मैं सिर्फ बाईं ओर नव डाला नोड को घुमाने के लिए कोशिश कर रहा हूँ। मेरी पेड़ केवल प्रारंभिक रूट (प्रथम नोड डाला) और अन्य सभी नोड्स लीक कर रहे हैं शामिल हैं: आरोही क्रम में पूर्णांकों डालने के लिए परिणाम।
समस्या की पहचान करने में किसी भी मदद अत्यधिक सराहना के रूप में मैं पागल हो जाने के लिए शुरू कर रहा है।
रिकॉर्ड के लिए: अगर मैं किसी भी रोटेशन का उपयोग नहीं करते पेड़ नोड्स लीक नहीं होगा और यह (प्रविष्टि और देखने के लिए) एक सामान्य असंतुलित द्विआधारी खोज वृक्ष के रूप में काम करता है।
संपादित करें: AJG85 की टिप्पणी के कारण मैं टिप्पणियों जोड़ देंगे:
मैं avl_search_tree :: avl_tree_node का नाशक विधि है कि avl_search_tree के डालने विधि है कि बस डाला गया कुंजी प्रिंट होगा करने के लिए सफाई से पहले कुंजी मान (मेरे मामले 32 बिट पूर्णांक में) प्रिंट होगा और, करने के लिए printf चेक 'जोड़ी गई।
फिर कार्यक्रम के entrypoint में मैं ढेर पर एक avl_search_tree आवंटित और आरोही क्रम में यह करने के लिए कुंजी जोड़ने और फिर इसे हटा दें।
AVL संतुलन सक्षम होने के साथ मैं टर्मिनल में निम्न उत्पादन मिलता है:
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
इसका मतलब है thatall सम्मिलन सफल रहे थे लेकिन केवल रूट हटा दिया गया है।
साथ AVL संतुलन बाहर टिप्पणी की यह एक सामान्य द्विआधारी खोज वृक्ष की तरह काम करता है। टर्मिनल आउटपुट है:
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
इसका मतलब है कि सब कुछ ठीक तरह से साफ किया जाता है।
अब ... कैसे मैं इस निष्कर्ष पर आया था कि रोटेशन तरीकों मुद्दों कर रहे हैं? टिप्पणी की AVL संतुलन सबरूटीन के तहत मैं एक पंक्ति है कि बाईं ओर हर हाल में डाला नोड घूमता गयी। परिणाम? एक ही AVL संतुलन सबरूटीन के रूप में यदि सक्षम किया गया था।
और विधि update_height () के बारे में, यह किसी भी तरह से पेड़ की संरचना में परिवर्तन नहीं करता।
मुझे आशा है कि यह यह स्पष्ट होगा।
संपादित करें 2:
कुछ और चीजों को स्पष्ट करने के लिए, उसकी कैसे 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 और _right_child ढेर पर आवंटित वस्तुओं avl_tree_node के संकेत दिए गए हैं।
संपादित करें 3:
AGJ85 के 2 टिप्पणी के लिए धन्यवाद मैं इस मुद्दे पाया। मेरी घुमाने के तरीकों में मैं भूल गया मैं वास्तव में नया रूट करने के लिए पेड़ की जड़ सूचक अद्यतन करने के लिए जब भी जड़ स्थानांतरित कर दिया गया है।
मूल रूप से पेड़ की जड़ हमेशा पहले डाला नोड के लिए और सूचक जब जरूरत, मेरे घुमाने तरीकों नया पेड़ की जड़ जो वास्तव में सही कॉन्फ़िगर किया गया था रिसाव करेगा अपडेट किए बिना इशारा करते हुए किया गया था। :)
आप AGJ85 धन्यवाद!













