संपादित करें: नीचे एक सामान्य उप-पेड़ हटाने के लिए है। आपको केवल एक ही Split
ऑपरेशन (आपकी वास्तविक प्रश्न सामग्री के आधार पर) की आवश्यकता है।
सबसे खराब मामले O(log n)
समय में लाल-काले पेड़ की पूरी उप-मिटाना हटाना संभव है।
यह ज्ञात है कि Split
और Join
लाल-काले पेड़ पर संचालन O(log n)
समय में किया जा सकता है।
स्प्लिट: को देखते हुए एक मूल्य के कश्मीर और एक लाल-काले ट्री टी, स्प्लिट टी दो लाल-काले पेड़ों T1 में और टी 2 ऐसी है कि टी 2 में टी 1 < कश्मीर में सभी मान और सभी मूल्यों> = k। टी 1 में एक भी लाल-काले पेड़ टी टी 1 में दो लाल-काले पेड़ों T1 और टी 2 कम्बाइन और टी 2 संतुष्ट अधिकतम < = टी 2 (या टी 1 < = संक्षेप में टी 2) में न्यूनतम:
जुड़ें।
आपको दो Splits
और एक Join
की आवश्यकता है।
आपके मामले में, उपट्री जिसे आपको हटाने की आवश्यकता है, L <= v <= U
मानों की एक श्रृंखला के अनुरूप होगी।
तो आप टी= टी 2 के साथ टी 1 और टी 2 प्राप्त करने के लिए एल पर पहले Split
लेते हैं। टी 3 < = टी 4 के साथ टी 3 और टी 4 प्राप्त करने के लिए Split
टी 2 पर टी 2। अब Join
पेड़ टी 1 और टी 4।
स्यूडोकोड में, अपने कोड कुछ इस तरह दिखेगा: https://cstheory.stackexchange.com/questions/1045/subrange-of-a-red-and-black-tree
:
Tree DeleteSubTree(Tree tree, Tree subTree) {
Key L = subTree.Min();
Key U = subTree.Max();
Pair <Tree> splitOnL = tree.Split(L);
Pair <Tree> splitOnU = splitOnL.Right.Split(U);
Tree newTree = splitOnL.Left.Join(splitOnU.Right);
return newTree;
}
अधिक जानकारी के लिए इस देखें
स्रोत
2011-04-14 19:02:02