एक द्विआधारी पेड़ में सबसे बड़े द्विआधारी खोज वृक्ष:
दो तरीके हम इस समस्या से संपर्क कर सकते हैं,
i) सबसे बड़ा BST प्रेरित नहीं (एक नोड से, अपने सभी बच्चों को BST शर्त पूरी नहीं की जरूरत नहीं है)
ii) सबसे बड़ा BST प्रेरित (एक नोड से, अपने सभी बच्चों को BST हालत को संतुष्ट करेगा)
हम सबसे बड़ा BST (प्रेरित नहीं) के बारे में यहाँ पर चर्चा करेंगे। हम नीचे से ऊपर दृष्टिकोण (पोस्ट आदेश ट्रावर्सल) इस हल करने के लिए का पालन करेंगे।
क) पत्ती नोड तक पहुंचें
ख) एक वृक्ष नोड (पत्ती से) एक TreeNodeHelper वस्तु जो उस में निम्नलिखित क्षेत्रों है वापस आ जाएगी।
public static class TreeNodeHelper {
TreeNode node;
int nodes;
Integer maxValue;
Integer minValue;
boolean isBST;
public TreeNodeHelper() {}
public TreeNodeHelper(TreeNode node, int nodes, Integer maxValue, Integer minValue, boolean isBST) {
this.node = node;
this.nodes = nodes;
this.maxValue = maxValue;
this.minValue = minValue;
this.isBST = isBST;
}
}
ग) शुरू में पत्ती नोड से, नोड्स = 1, isBST = सच है, MINVALUE = MAXVALUE = node.data। और आगे, नोड्स गिनती अगर यह BST हालत संतुष्ट बढ़ जाएगी।
घ) इस की मदद से, हम वर्तमान नोड के साथ BST हालत की जाँच करेगा। और हम जड़ तक एक ही दोहराया जाएगा।
ई) प्रत्येक नोड से दो वस्तुओं लौटा दी जाएगी। पिछले अधिकतम BST और वर्तमान BST संतोषजनक नोड्स के लिए एक और एक के लिए एक। तो (पत्ता ऊपर) प्रत्येक नोड (2 + 2) = 4 (2 बाईं सबट्री के लिए और 2 सही उप पेड़ के लिए) से वस्तुओं तुलना में किया जाएगा और दो लौटा दी जाएगी।
च) जड़ से अंतिम अधिकतम नोड वस्तु सबसे बड़ा BST हो जाएगा
मुसीबत:
इस दृष्टिकोण में कोई समस्या है। इस दृष्टिकोण का अनुसरण करते हुए, यदि एक सबट्री वर्तमान नोड के साथ BST हालत संतोषजनक नहीं है, हम बस सबट्री नजरअंदाज नहीं कर सकते (यहां तक कि यह नोड्स की कम संख्या है)। उदाहरण के लिए
55
\
75
/ \
27 89
/ \
26 95
/ \
23 105
/ \
20 110
पत्र-गांठ (20,110) वस्तुओं नोड (105) के साथ परीक्षण किया जाएगा, यह शर्त संतुष्ट करता है। लेकिन जब यह नोड तक पहुँच जाता है (95) पत्ती नोड (20) BST शर्त पूरी नहीं करता है। चूंकि यह समाधान BST (प्रेरित नहीं) के लिए है हम नोड (105) और नोड (110) जो हालत को संतुष्ट करता अनदेखी नहीं करनी चाहिए। तो नोड (95) से हम BST हालत का परीक्षण फिर से पीछे और उन नोड्स (105, 110) को पकड़ने के लिए की है।
इस कार्यान्वयन के लिए पूरा कोड इस लिंक में उपलब्ध है
https://github.com/dineshappavoo/Implementation/tree/master/LARGEST_BST_IN_BT_NOT_INDUCED_VER1.0