द्विआधारी खोज पेड़ - हटाएँ

वोट
1

मैं एक प्रोग्राम है जो तार में ले जाता है और वर्णमाला के क्रम में एक द्विआधारी खोज वृक्ष में उन्हें देता है एक बार इन पेड़ में डाला जाता है लिखने के लिए कोशिश कर रहा हूँ, एक उपयोगकर्ता को संकेत देता के लिए एक शब्द, हटाए जाने के लिए इस प्रकार के पेड़ से उस नोड को हटाने, और फिर उत्पादन उस नोड के क्रम में वापस बिना पेड़।

सब कुछ हटा समारोह अप करने के लिए इस बात के लिए काम करता है, हटाने समारोह काम करता है, लेकिन इसकी बहुत अजीब है कि यह कैसे हटा देता है। मैं वर्तमान में यह पेड़ की एक पूरी पक्ष हटाता है, क्योंकि जब मैं अंतिम शब्द हटाने के लिए, यह आम तौर पर काम करता है लगता है। मैं अपने नष्ट समारोह अपलोड करेंगे और अगर अधिक की जरूरत है मैं अपने कोड के बाकी अपलोड कर सकते हैं।

धन्यवाद!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
31/03/2011 को 03:24
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
1

के लिए बाएं या दाएं जा रहा है आपका मामलों NULLअच्छे हैं। हालांकि, उनमें होने का न करने के लिए अपने तर्क NULLहै, दुर्भाग्य से, ऐसा न करने।

मैं अपने कोड पढ़ रहा हूँ (और कार्य को समझने के replace_parent()लिए सही ढंग से, तो अगर न पेड़ खाली तुम्हारे साथ वर्तमान जड़ की जगह हो रहा है Left

अपने आप से पूछें - क्या मानों में हैं करने के लिए हो रहा है Rightसबट्री?

क्या आप एक नोड को हटाने के लिए क्या करने की जरूरत इस प्रकार है:

  1. Subtrees में से एक दर्ज करें। ऐसा लगता है कि आप अपने द्वारा चुने गए Leftसबट्री, तो हम वहाँ से जाना होगा।
  2. का पालन करें विपरीत शाखाओं की लाइन। इस उदाहरण में, नीचे जा रहा रखने के Rightअपने मूल से subtrees Left। जब तक आप एक सही पत्ती नोड को खोजने के लिए जा रहा रखने के लिए (कोई Rightsubtrees, Leftठीक है)
  3. एक में अपने दाहिने पत्ती का मूल्य याद रखें tmpचर।
  4. सही पत्ती के स्थानांतरण Left(चाहे NULLया नहीं) पर राइट-पत्ती की स्थिति के लिए।
  5. लो tmpमूल्य और यह अपने मूल 'को हटाना रद्द करें' नोड में डाल दिया।
31/03/2011 को 03:38
का स्रोत उपयोगकर्ता

वोट
2

Lacqui अपने अंक में सही है।

मुझे आप आपको बता दूँ कि एक नोड को हटाने के दौरान आप या तो छोड़ दिया उप पेड़ में अधिकतम नोड या सही उप पेड़ में न्यूनतम नोड के साथ बदलने की जरूरत हैं। उदाहरण के लिए: आप नीचे चित्र देखें, तो: यहाँ छवि विवरण दर्ज

यदि आप नोड 90 हटाना चाहते हैं, तो आप कि आप या तो 80 जो बाईं सबट्री में अपनी अधिकतम नोड है या 92 से बदलने देखभाल करने की जरूरत है जो सही उप पेड़ में न्यूनतम नोड। आप किसी भी एक दृष्टिकोण रख सकते हैं।

इसलिए algo हो जाएगा: छोड़ दिया उप पेड़ पर विचार:

-> अगर आप हटाना नोड मिल जाए, अपने बाएँ उप पेड़ में अधिकतम मूल्य पर जाएँ।

-> 50 और नोड अधिकार के रूप में नोड के बाएं आवंटित 150 होने के लिए

-> 75 अगले के रूप में अशक्त बनाने> और 90 को हटा दें

18/04/2011 को 11:22
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more