इस तरह की चीजों में, अक्सर पीछे की ओर सोचना आसान होता है, इसलिए पहले विचार करें कि आपको क्या चाहिए। अपने विवरण से, आइए उन्हें सूचीबद्ध करें:
- प्रत्यावर्तन
- वैधता
- पूर्ण नोड्स की गणना
ठीक है, यह एक काफी छोटी सूची है, यह प्रबंधनीय होना चाहिए। चलो एक खाली विधि के साथ शुरू करते हैं और मैं वर्णन करूंगा कि क्या हो रहा है।
valid_bst () {
}
अब वैधता है। आप वैधता की जांच कैसे करते हैं? चैट में आपने कहा कि एक पेड़ वैध है "यदि ... सभी बचे बच्चे माता-पिता से कम हैं, और दाएं बच्चे माता-पिता से अधिक हैं।" मुझे यकीन है कि आप समानता की अनुमति देना चाहते हैं। वह होगा t.left.value <= t.value <= t.right.value
।
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
लेकिन क्या होगा अगर बच्चों में से एक गायब है? आपने जो कहा है, मुझे लगता है कि आप जानते हैं कि नोड अभी भी वैध है यदि कोई लापता है (या दोनों हैं)। चलो इसे जोड़ते हैं, थोड़ा पुनर्गठन करते हैं:
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
}
ठीक है, अब हम जानते हैं कि क्या यह नोड वैध है। हम कैसे जांचें कि क्या पूरा पेड़ वैध है? यह एक सरणी में नहीं है, इसलिए हम शायद इसे रैखिक रूप से लूप नहीं कर सकते / नहीं करना चाहते। आपका असाइनमेंट जवाब देता है: पुनरावृत्ति। लेकिन हम पुनरावृत्ति का उपयोग करके उत्तर कैसे जमा करते हैं? हमारे पास जानकारी के तीन टुकड़े हैं, चाहे यह नोड मान्य है, और कॉल का परिणाम यह पूछ रहा है कि क्या बाएं और दाएं नोड्स वैध हैं। जाहिर है कि पेड़ केवल तभी वैध होगा जब वे तीनों सत्य होंगे।
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
Is the left child valid?
Is the right child valid?
This tree is only valid if this node and both its children are.
}
यदि आप ध्यान दे रहे हैं, तो हमें यह भी बताता है कि हमारे कार्य को वापस क्या चाहिए।
अब, हम गिनती को कैसे एकीकृत करते हैं? आप कहते हैं कि क्या मायने रखता है ("बाएं और दाएं बच्चे दोनों नोड्स के साथ एक मूल नोड"), और वास्तविक कोड में अनुवाद करना मुश्किल नहीं होना चाहिए। जांचें कि क्या वह शर्त संतुष्ट है और उचित रूप से काउंटर बढ़ाएं। बस याद रखें कि यह कहीं न कहीं है जहां यह हर बार सच हो जाएगा।
और निश्चित रूप से मैंने कुछ विवरण छोड़ दिए हैं जैसे कि पुनरावृत्ति रोकने की स्थिति और अशक्त के लिए जांच।
<
को नोड्स पर कैसे परिभाषित किया जाता है?