एक द्विआधारी खोज वृक्ष के लिए हटाने की प्रक्रिया

वोट
7

एक BST पर हटाए जाने की प्रक्रिया पर विचार करें जब नष्ट करने के लिए नोड दो बच्चे हैं। मान लीजिए कि मैं हमेशा नोड अपने अधिकार सबट्री में न्यूनतम कुंजी दबाए साथ बदलें करते हैं।

सवाल यह है: इस प्रक्रिया विनिमेय है? यही कारण है, एक्स को हटाने और फिर y को हटाने पहले y और फिर एक्स से एक ही परिणाम है?

मुझे लगता है कि जवाब नहीं है, लेकिन मैं एक प्रति नहीं मिल रहा, न ही कोई वैध तर्क यह पता लगाने कर सकते हैं।

संपादित करें:

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

पर विचार करें transplant(node x, node y)प्रक्रिया: यह y (और इसके सबट्री) के साथ एक्स बदलें। तो, अगर मैं एक नोड को हटाना चाहते हैं (जैसे कि एक्स) जो दो बच्चे हैं मैं इसे नोड अपने अधिकार सबट्री में न्यूनतम कुंजी दबाए रख के साथ बदलें:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

प्रश्न साबित करने के लिए कैसे उपरोक्त प्रक्रिया विनिमेय नहीं है था।

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


4 जवाब

वोट
17

(सामान्य रूप में) को हटाए जाने की विनिमेय नहीं है। यहाँ प्रति एक है:

    4
   / \
  3   7
     /
    6

क्या होगा अगर हम 4 और फिर 3 हटाना चाहते हैं?

जब हम 4 हटाते हैं, तो हम नए रूट के रूप में 6 मिलती है:

   6
  / \
 3   7

3 हटाया जा रहा है पेड़ परिवर्तन नहीं करता है, लेकिन हमें इस देता है:

  6
   \
    7

क्या होगा अगर हम 3 और फिर 4 हटाना चाहते हैं?

जब हम 3 हटाना पेड़ परिवर्तन नहीं करता है:

 4
  \
   7
  /
 6

हालांकि, जब हम अब 4 हटाते हैं, तो नया रूट 7 हो जाता है:

  7
 /
6

दो परिणामस्वरूप पेड़, ही नहीं हैं इसलिए विलोपन विनिमेय नहीं है।

अद्यतन करें

मैं प्रतिबंध नहीं पढ़ा था कि यह तब होता है जब आप हमेशा 2 बच्चों के साथ एक नोड को हटा दें। मेरे समाधान सामान्य स्थिति के लिए है। जब मैं एक जवाबी उदाहरण मिल सकता है / मैं इसे अपडेट करेंगे।

कोई अन्य अपडेट

मैं ठोस सबूत की जरूरत नहीं है, लेकिन मैं एक अनुमान खतरे लिए जा रहा हूँ:

सामान्य स्थिति में, आप विलोपन अलग तरह से है कि क्या आप दो बच्चों, एक बच्चा, या कोई बच्चे हैं के आधार पर संभाल। जवाबी उदाहरण मैं प्रदान की में, मैं पहले दो बच्चों और फिर एक बच्चे के साथ एक नोड के साथ एक नोड को हटा दें। उसके बाद, मैं कोई बच्चा नहीं है और फिर एक बच्चे के साथ एक और नोड के साथ एक नोड को हटा दें।

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

दो नोड्स ए और बी जहां एक बी के एक पूर्वज है तो फिर तुम आगे सवाल को परिष्कृत हो सकता है पर विचार करें:

विलोपन विनिमेय जब आप एक द्विआधारी खोज वृक्ष जो एक दूसरे के एक पूर्वज-वंशज रिश्ता है से दो नोड्स का विलोपन (यह है कि वे एक ही उप पेड़ में हैं अर्थ होगा) पर विचार कर रहे है?

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

एक ही प्रक्रिया है कि बी के लिए शामिल किया गया है, तो आप नोड के मूल्य की जगह और एक पत्ता नोड की जगह। तो सामान्य रूप में, जब आप दो बच्चों के साथ एक नोड हटाने के लिए, केवल संरचनात्मक परिवर्तन नोड आप हटा रहे हैं के मूल्य में परिवर्तन, और पत्ती नोड जो मूल्य आप स्थानापन्न के रूप में प्रयोग कर रहे हैं है का विलोपन है

तो सवाल यह परिष्कृत है:

आप गारंटी ले सकते हैं कि आप हमेशा (जब आप हमेशा दो बच्चों के साथ एक नोड हटा रहे हैं) हटाए जाने के आदेश की परवाह किए बिना एक ही प्रतिस्थापन नोड मिलेगा?

इस सवाल का जवाब (मुझे लगता है कि) हां में है। क्यूं कर? यहाँ कुछ टिप्पणियों हैं:

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

यह एक कठोर सबूत नहीं है, इन बस कुछ टिप्पणियों मैं बनाया है कर रहे हैं। हर तरह से, छेद प्रहार करने में संकोच न!

07/06/2010 को 18:32
का स्रोत उपयोगकर्ता

वोट
0

मैं Vivin की दूसरी अद्यतन करने के लिए यहाँ जवाब देते हैं।

मुझे लगता है कि इस सवाल का एक अच्छा मरम्मत है:

विलोपन विनिमेय जब आप एक द्विआधारी खोज वृक्ष जो एक दूसरे के एक पूर्वज-वंशज रिश्ता है से दो नोड्स का विलोपन (यह है कि वे एक ही उप पेड़ में हैं अर्थ होगा) पर विचार कर रहे है?

लेकिन नीचे इस बोल्ड वाक्य सच नहीं है:

जब आप एक नोड को हटाने के लिए आप सही उप पेड़ पार न्यूनतम तत्व को खोजने के लिए (के एक मान लीजिए),। इस नोड एक पत्ता नोड हो जाएगा और B के बराबर कभी नहीं हो सकता

एक के अधिकार सबट्री में न्यूनतम तत्व के बाद से एक सही बच्चे हो सकता है । इसलिए, यह एक पत्ता नहीं है। के ए के अधिकार सबट्री में न्यूनतम तत्व कहते हैं successor(A)। अब, यह सच है कि बी नहीं किया जा सकता successor(A)है, लेकिन यह अपने अधिकार सबट्री में हो सकता है। इसलिए, यह एक मेस है।

मैं संक्षेप में प्रस्तुत करने का प्रयास करें।

हाइपोथीसिस :

  1. ए और बी दो बच्चों प्रत्येक की है।
  2. ए और बी एक ही सबट्री में हैं।

अन्य सामान हम परिकल्पना से अनुमान लगा सकते हैं:

  1. बी नहीं है successor(A), न तो एक है successor(B)

अब, यह देखते हुए, मुझे लगता है कि 4 अलग मामले हैं (हमेशा की तरह, एक बी के एक पूर्वज रहने दो):

  1. बी ए के बाएं सबट्री में है
  2. बी के एक पूर्वज है successor(A)
  3. successor(A) बी के एक पूर्वज है
  4. बी और उत्तराधिकारी (ए) किसी भी संबंध नहीं है। (वे अलग एक के subtrees में हैं)

मुझे लगता है कि (लेकिन निश्चित रूप से मैं यह साबित नहीं कर सकते) है कि मामलों 1, 2 और 4 में कोई फर्क नहीं है। तो, केवल मामले में successor(A)बी विलोपन प्रक्रिया के एक पूर्वज विनिमेय नहीं किया जा सका है। या यह कर सकते थे?

मैं गेंद पास:)

सादर।

11/06/2010 को 18:45
का स्रोत उपयोगकर्ता

वोट
2

मुझे ऐसा लगता है कि प्रति एक Vivin के जवाब में दिखाया गया है गैर commutativity की एकमात्र मामला है, और है कि यह वास्तव में प्रतिबंध यह है कि केवल के साथ दो बच्चों को हटाया जा सकता है नोड से सफाया कर दिया है।

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

    7
   /
  6
पर पहुंच गया कभी नहीं किया गया है अगर हम पर शुरू

    4
   / \
  3 से 7
     /
    6

इसके बजाय, हम पहले (उत्तराधिकारी) के बिना 3 हटाना होगा और उसके बाद (उत्तराधिकारी के रूप में 6 के साथ) 4 हटाने के लिए, उपज

    6
     \
      7

जो के रूप में यदि हटाए जाने के आदेश वापस ले लिया गया एक ही है।

विलोपन तो विनिमेय हो सकता है, और मुझे लगता है कि यह हमेशा विनिमेय है, आधार मैं नाम दिया दिया (उत्तराधिकारी हमेशा नष्ट कर दिया नोड के सही सबट्री में सबसे छोटी नोड है)।

मैं पेशकश करने के लिए, केवल मामलों की गणना एक औपचारिक प्रमाण नहीं है:

  1. दो नोड्स हटाए जाने के लिए अलग subtrees में हैं, तो एक का विलोपन अन्य प्रभावित नहीं करता। केवल जब वे एक ही रास्ते में हैं हटाने के आदेश संभवतः परिणाम को प्रभावित कर सकते हैं।

    तो commutativity पर कोई असर ही आ सकता है जब एक पूर्वज नोड और उसके वंश में से एक दोनों नष्ट हो जाती हैं। अब, कैसे अपने ऊर्ध्वाधर संबंध commutativity प्रभावित करता है?

  2. पूर्वज के बाईं सबट्री में वंशज। यह स्थिति commutativity को प्रभावित नहीं करेगा क्योंकि उत्तराधिकारी सही सबट्री से आता है और सब पर छोड़ दिया सबट्री को प्रभावित नहीं कर सकते हैं।

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

06/04/2011 को 19:34
का स्रोत उपयोगकर्ता

वोट
0

मुझे लगता है कि वहाँ एक नोड को हटाने के लिए दो समान रूप से व्यवहार्य तरीके हैं, जब यह 2 बच्चे हैं:
मामला 4 पर जाएं ...

केस 1: को नष्ट 3 (पत्ता नोड)
 2 3
 / \ -> / \
1 3 1


केस 2: को नष्ट 2 (वाम चाइल्ड नोड)
 2 3
 / \ -> / \
1 3 1


केस 3: 2 हटाना (सही चाइल्ड नोड)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
: प्रकरण 4 2 (लेफ्ट और राइट बच्चे नोड्स) को हटाने के
 2 2 3
 -> / \ या / \ / \      
1 3 1 3
दोनों काम और विभिन्न जिसके परिणामस्वरूप पेड़ :) है ______________________________________________________________________
: एल्गोरिथ्म के रूप में यहां बताया गया है http: // www .mathcs.emory.edu / ~ च्युंग / पाठ्यक्रम / 323 / पाठ्यक्रम / पेड़ / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

10/10/2016 को 01:02
का स्रोत उपयोगकर्ता

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