लाल-काले पेड़ होने के लिए एक द्विआधारी पेड़ को रंग दें


16

एक सामान्य साक्षात्कार प्रश्न यह निर्धारित करने के लिए एक एल्गोरिथ्म देना है कि क्या किसी दिए गए बाइनरी ट्री की ऊंचाई संतुलित है (एवीएल ट्री परिभाषा)।

मैं सोच रहा था कि क्या हम रेड-ब्लैक पेड़ों के साथ कुछ ऐसा कर सकते हैं।

एक अनियंत्रित अनचाहे बाइनरी ट्री (NULL नोड्स के साथ) को देखते हुए, एक "तेज" एल्गोरिथ्म है जो यह निर्धारित कर सकता है कि क्या हम नोड्स को लाल (काला) रंग कर सकते हैं (ताकि एक रंग मिल जाए) ताकि वे एक लाल-काले पेड़ के सभी गुणों को संतुष्ट कर सकें (इस प्रश्न में परिभाषा के अनुसार )?

एक प्रारंभिक विचार यह था कि हम केवल NULL नोड्स को हटा सकते हैं और पुन: सत्यापित करने का प्रयास कर सकते हैं कि परिणामी पेड़ लाल-काला पेड़ हो सकता है, लेकिन ऐसा कहीं भी नहीं लगता है।

मैंने कागजात के लिए एक संक्षिप्त (वेब) खोज की, लेकिन इस समस्या से निपटने के लिए कोई भी ऐसा प्रतीत नहीं हुआ।

यह संभव है कि मैं कुछ सरल याद कर रहा हूं।


मैं कर रहा हूँ यकीन है कि एक पेड़ लाल-काले रंग का हो सकता है iff प्रत्येक नोड के लिए, एक शून्य नोड के लिए इसे से सबसे लंबे समय तक पथ कम से कम एक से दो बार से अधिक समय तक नहीं रहा। क्या यह उपवास काफी है?
कारोलिस जुओदेलो

जवाबों:


12

यदि किसी पेड़ के प्रत्येक नोड के लिए, पत्ती के नोड तक का सबसे लंबा रास्ता सबसे छोटा होने की तुलना में दोगुना से अधिक नहीं है, तो पेड़ में लाल-काला रंग होता है।

यहाँ किसी भी नोड के रंग का पता लगाने के लिए एक एल्गोरिथ्म है n

if n is root,
    n.color = black
    n.black-quota = height n / 2, rounded up.

else if n.parent is red,
    n.color = black
    n.black-quota = n.parent.black-quota.

else (n.parent is black)
    if n.min-height < n.parent.black-quota, then
        error "shortest path was too short"
    else if n.min-height = n.parent.black-quota then
        n.color = black
    else (n.min-height > n.parent.black-quota)
        n.color = red
    either way,
        n.black-quota = n.parent.black-quota - 1

यहां n.black-quotaकाले नोड्स की संख्या है जो आपको नोड से, पत्ती पर जाने की उम्मीद है nऔर n.min-heightनिकटतम पत्ती से दूरी है।

अंकन की संक्षिप्तता के लिए, , एच ( एन ) = और एम ( एन ) =b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height

प्रमेय: एक बाइनरी ट्री ठीक करें । अगर हर नोड के लिए n टी , ( एन ) 2 मीटर ( एन ) और नोड के लिए आर = जड़ ( टी ) , ( आर ) [ 1TnTh(n)2m(n)r=root(T)तबT केपासरूट से लीफ तक हर पथ परबिलकुलb(r)ब्लैक नोड्स केसाथ एक लाल-काला रंग होता है।b(r)[12h(r),m(r)]Tb(r)

प्रमाण: पर प्रेरण ।b(n)

सत्यापित करें कि ऊंचाई के सभी चार पेड़ एक या दो साथ प्रमेय को संतुष्ट करते हैं ।b(n)=1

लाल-काले पेड़ की परिभाषा से, जड़ काला है। चलो एक काला माता पिता के साथ एक नोड हो पीnp ऐसी है कि । फिर(एन)=(पी)-1,एच(एन)=(पी)-1औरएच(एन)मीटर(एन)मीटर(पी)-1b(p)[12h(p),m(p)]b(n)=b(p)1h(n)=h(p)1h(n)m(n)m(p)1

मान लें कि प्रमेय जड़ , बी ( आर ) < बी ( क्यू ) के साथ सभी पेड़ों के लिए रखती है ।rb(r)<b(q)

यदि , तो n आगमनात्मक धारणा द्वारा लाल-काले रंग का हो सकता है।b(n)=m(n)n

यदि फिरबी(एन)=then1b(p)=12h(p)एनआगमनात्मक धारणा को संतुष्ट नहीं करता है और इस तरह लाल होना चाहिए। Letcका एक बच्चा होनाएनh(c)=h(p)-2और b(c)=b(p)-1=1b(n)=12h(n)1ncnh(c)=h(p)2b(c)=b(p)1=12h(p)1=12h(c). Then c can be red-black colored by the inductive assumption.

Note that, by the same reasoning, if b(n)(12h(r),m(r)), then both n and a child of n satisfy the inductive assumption. Therefore n could have any color.


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

@ आर्यभट्ट, मैंने एक प्रमाण जोड़ा। माफ़ करें मुझे इतना समय लग गया।
कारोलिस जुओदेलो

@ आर्यभट्ट, विचार यह है कि यदि (पी) कुछ नोड के पी एक निश्चित सीमा के साथ, एक बच्चा या पोता है सी का पी हो सकता है (सी)उन्हीं बंधों के भीतर। बीत रहा है(n) उन सीमाओं के अनुरूप हो सकते हैं nकाला होना। अधिकांश प्रमाण बाउंडिंग के बारे में है तथा एक बच्चे या पोते की, दी तथा of the parent or grandparent. Your tree is certainly colorable. b(root)=8, left child is black and right child is red, the path of length 16 is brbrbr, the path of length 8 is bbbbbbbb, paths of 9 and 12 can have multiple valid colorings.
Karolis Juodelė


2

I believe Karolis' answer is correct (and a pretty nice characterization of red-black trees, giving an O(n) time algorithm), just wanted to add another possible answer.

One approach is to use dynamic programming.

Given a tree, for each node n, you construct two sets: SR(n) and SB(n) which contains the possible black-heights for the subtree rooted at n. SR(n) contains the black-heights assuming n is coloured Red, and SB(n) assuming n is coloured black.

Now given the sets for n.Left and n.Right (i.e direct children of n), we can compute the corresponding sets for n, by taking appropriate intersections and unions (and incrementing as needed).

I believe this comes out be an O(nlogn) time algorithm.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.