द्विआधारी खोज वृक्ष में हटाना चाहते हैं?

वोट
0

मैं द्विआधारी पेड़ के माध्यम से पढ़ रहा हूँ नोड किताब में प्रयोग किया जाता एल्गोरिथ्म हटाने के डाटा संरचनाओं और एल्गोरिदम: उदाहरण के साथ एनोटेट संदर्भ

पेज 34, मामले 4 (नोड जो दोनों दाएं और बाएं उप पेड़ है हटाएँ), निम्नलिखित कलन विधि पुस्तक लग रहा है काम नहीं करता है में वर्णित पर, शायद मैं किसी को मेरी मदद कर सकता है कि मैं क्या याद आ रही है गलत हो सकता है।

//Case 4
get largestValue from nodeToRemove.Left
FindParent(largestValue).Right <- 0
nodeToRemove.Value<-largestValue.Value

कैसे निम्नलिखित लाइन उप पेड़ से सबसे बड़ा मान हटाता है FindParent(largestValue).Right <- 0

29/06/2010 को 21:09
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
1

विचार बस, यानी, बाएं हाथ की ओर सबसे बड़ा नोड से मान ले और नोड कि हटाया जा रहा है करने के लिए ले जाने के लिए, सब पर नोड नहीं हटाते हैं तो बस यह सामग्री है की जगह है। तो फिर तुम मूल्य आप "हटाए गए" नोड में चले गए साथ नोड बाहर छँटाई। यह बड़ा यह सभी इसके बारे में सब ठीक बच्चों है की तुलना में बच्चों और छोटे बचा है की तुलना में प्रत्येक नोड के मूल्य के साथ पेड़ आदेश रखता है।

29/06/2010 को 21:16
का स्रोत उपयोगकर्ता

वोट
1

अगर मैं छद्म कोड को समझते हैं, यह सामान्य स्थिति में काम करता है, लेकिन मामले "बाईं सबट्री में एक नोड" में विफल रहता है। अच्छा पकड़ा।

इसे प्रभावी ढंग से largest_value साथ node_to_remove की जगह यह बाईं सबट्री (भी पुराने largest_value नोड nulls) है से।

ध्यान दें कि एक BST में, node_to_remove के बाईं सबट्री सभी node_to_remove की तुलना में छोटा हो जाएगा। node_to_remove के अधिकार सबट्री सभी node_to_remove से भी बड़ा हो जाएगा। तो अगर आप छोड़ दिया सबट्री में सबसे बड़ा नोड ले, यह अपरिवर्तनीय सुरक्षित करेगा।

यह एक "सबट्री मामले में एक नोड" है, तो यह सही सबट्री बजाय नष्ट कर देंगे। लंगड़ा :(

Vivin बताते हैं, यह भी largestNode के बाईं बच्चों पुनः अनुलग्न विफल रहता है।

29/06/2010 को 21:16
का स्रोत उपयोगकर्ता

वोट
6

जब दो बच्चों के साथ एक नोड को हटाने, आप या तो अपने इन-आदेश उत्तराधिकारी नोड या उसके आदेश पूर्ववर्ती नोड चुन सकते हैं। इस मामले में यह जो है कि यह नोड के इन-आदेश पूर्ववर्ती नोड रही है इसका मतलब छोड़ दिया उप पेड़ में सबसे बड़ा मान (अपनी बाईं उप पेड़ की सबसे-दाएं बच्चे अर्थ), ढूँढने है।

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

संपादित करें

अपने प्रश्न थोड़ा और अधिक पढ़ने के बाद, मुझे लगता है कि मैं इस समस्या मिल गया है।

आमतौर पर क्या आप के अलावा है deleteसमारोह एक है replaceसमारोह है कि प्रश्न में नोड बदल देता है। मुझे लगता है कि आप कोड की इस पंक्ति को बदलने की जरूरत:

FindParent(largestValue).Right <- 0

सेवा मेरे:

FindParent(largestValue).Right <- largestValue.Left

तो largestValueनोड एक छोड़ दिया बच्चे को नहीं है, तो आप बस मिल nullया 0। यह एक छोड़ दिया बच्चा है करता है, कि बच्चे के लिए एक स्थानापन्न हो जाता है largestValueनोड। तो तुम सही हो; कोड को ध्यान में परिदृश्य नहीं ले करता है largestValueनोड एक छोड़ दिया बच्चे को हो सकता है।

एक और संपादित करें

जब से तुम केवल एक टुकड़ा पोस्ट किया है, मुझे यकीन है कि क्या कोड के संदर्भ है नहीं कर रहा हूँ। लेकिन पोस्ट करने से स्निपेट समस्या आप सुझाव है (गलत नोड की जगह) है लगता है। आम तौर पर, तीन मामलों रहे हैं, लेकिन मैं लगता है कि आपकी स्निपेट में टिप्पणी कहते हैं //Case 4(ताकि शायद कुछ अन्य संदर्भ है)।

इससे पहले, मैं तथ्य यह है कि उल्लेख deleteआम तौर पर एक के साथ आता है replace। तो अगर आप को खोजने के largestValueनोड, आप इसे दो साधारण मामलों (कोई बच्चों के साथ नोड, और एक बच्चे के साथ नोड) के अनुसार हटा दें। आप दो बच्चों के साथ एक नोड को हटाने के लिए छद्म कोड देख रहे तो अगर, यह है कि क्या करना है:

get largestValue from nodeToRemove.Left
nodeToRemove.Value <- largestValue.Value

//now replace largestValue with largestValue.Left    

if largestValue = largestValue.Parent.Left then   
   largestValue.Parent.Left <- largestValue.Left //is largestValue a left child?
else //largestValue must be a right child
   largestValue.Parent.Right <- largestValue.Left

if largestValue.Left is not null then
   largestValue.Left.Parent <- largestValue.Parent

मैं यह अजीब है कि एक डाटा संरचनाओं और एल्गोरिदम किताब की इस भाग छोड़ना होगा लगता है, इसलिए मैं यह करने के लिए आसान बनाने के लिए पुस्तक की उपलब्धता लगता है आगे (के बाद से वहाँ तीन मानक मामलों रहे हैं) के लिए कुछ और मामलों में हटाए जाने को विभाजित करने के लिए इच्छुक हूँ समझना।

कि इसके बाद के संस्करण कोड काम करता है साबित करने के लिए निम्न पेड़ पर विचार करें:

  8
 / \
7   9

मान लीजिए कि आप को नष्ट करना चाहते हैं 8। आप खोजने की कोशिश largestValueसे nodeToRemove.Left। यह आपको देता है 7के बाद से बाईं उप पेड़ केवल एक ही बच्चा है।

तो फिर तुम कार्य करें:

nodeToRemove.Value <- largestValue.Value

जिसका मतलब है:

8.value <- 7.Value

या

8.Value <- 7

तो अब अपने पेड़ इस तरह दिखता है:

  7
 / \
7   9

आप प्रतिस्थापन नोड से छुटकारा पाने की जरूरत है और इसलिए आप को बदलने के लिए जा रहे हैं largestValueके साथ largestValue.Left(जो null)। तो सबसे पहले आपको पता लगाना बच्चे की तरह क्या 7है:

if largestValue = largestValue.Parent.Left then

जिसका मतलब है:

if 7 = 7.Parent.Left then

या:

if 7 = 8.Left then

चूंकि 7यह है 8की बाईं बच्चे, प्रतिस्थापित करने की आवश्यकता 8.Leftके साथ 7.Right( largestValue.Parent.Left <- largestValue.Left)। के बाद से 7कोई संतान नहीं है, 7.Leftरिक्त है। तो largestValue.Parent.Leftशून्य पर (जो प्रभावी रूप से अपने बाएँ बच्चे को हटाता है) सौंप दिया जाता है। तो इसका मतलब है कि आप निम्नलिखित पेड़ के साथ अंत:

  7
   \
    9
29/06/2010 को 21:17
का स्रोत उपयोगकर्ता

वोट
0

इसे और अधिक अर्थपूर्ण हो सकता है जब आप को देखो विकिपीडिया के एल्गोरिथ्म के उस हिस्से पर ले:

दो बच्चों के साथ एक नोड हटाया जा रहा है : नोड कॉल हटाए जाने के लिए "एन"। इसके बजाय एन न हटाएँ, या तो अपने इन-आदेश उत्तराधिकारी नोड या उसके आदेश पूर्ववर्ती नोड, "आर" का चयन करें। आर के मूल्य के साथ एन के मूल्य को बदलें, फिर हटाएं आर (नोट: आर ही एक बच्चे के लिए ऊपर है।)

ध्यान दें कि दिए गए एल्गोरिथ्म में क्रम के पूर्ववर्ती नोड चुनता है।

संपादित करें: क्या संभावना है कि आर (विकिपीडिया के शब्दावली का उपयोग करने के लिए) लापता हो गया लगता है एक बच्चा है। एक पुनरावर्ती बेहतर काम कर सकते हैं हटा दें।

29/06/2010 को 21:20
का स्रोत उपयोगकर्ता

वोट
1

मैं तुम्हें स्पष्ट करने के लिए काम नहीं करता है क्या आवश्यकता हो सकती है लगता है।

मैं कोशिश करते हैं और एक द्विआधारी पेड़ मामले में इस में मदद करता है में हटाए जाने की अवधारणा की व्याख्या करेगा।

मान देता है जिन्हें आप पेड़ दो बच्चे नोड्स है कि आप को नष्ट करना चाहते है कि में एक नोड है। पेड़ में नीचे का कहना है की सुविधा देता है कि आप नोड बी हटाना चाहते हैं
           एक
         / \
       ख ग
     / \ / \
   घ ई च जी

जब हम एक नोड हटाना हम अपनी निर्भर नोड्स पुनः अनुलग्न की जरूरत है।

अर्थात। जब हम ख हटाना हम पुनः अनुलग्न नोड्स डी और ई की जरूरत है।

हम जानते हैं कि बाईं नोड्स मूल्य में सही नोड्स से भी कम समय और हैं कि माता-पिता नोड्स छोड़ दिया और सही नोड में मूल्य के बीच हैं। इस मामले घ <b और ख <ई में। यह एक द्विआधारी पेड़ की परिभाषा का हिस्सा है।

क्या थोड़ा कम स्पष्ट है कि ई <एक है। तो इसका मतलब है कि हम ई के साथ ख बदल सकते हैं। अब हम ई हम पुनः अनुलग्न घ जरूरत reattached है।

जैसा कि पहले घ <ई कहा तो हम ई के बाईं नोड के रूप में ई संलग्न कर सकते हैं।

विलोपन अब पूरा हो गया है।

(Btw एक नोड इस फैशन में पेड़ ऊपर जा रहा है और इस पर निर्भर नोड्स उलटफेर करने की प्रक्रिया एक नोड को बढ़ावा देने के रूप में जाना जाता है। तुम भी अन्य नोड हटाए बिना एक नोड को बढ़ावा देने के कर सकते हैं।)


           एक
         / \
       घ ग
         \ / \
          ई च जी

नोट deleteing नोड बी की एक और पूरी तरह से वैध परिणाम नहीं है। अगर हम नोड ई के बजाय नोड घ बढ़ावा देने के लिए चुना है पेड़ इस प्रकार दिखाई देगा।


           एक
         / \
       ई सी
     / / \
   घ च छ

29/06/2010 को 21:44
का स्रोत उपयोगकर्ता

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