2013-10-03 8 views
7

मैं बस एक बाइनरी पेड़ के आकार को खोजने के लिए इस कोड में आया था।बाइनरी पेड़ के लिए आकार विधि

public int size() { 
    return(size(root)); 
} 
private int size(Node node) { 
    if (node == null) return(0); 
    else { 
    return(size(node.left) + 1 + size(node.right)); 
    } 
} 

मुझे उलझन में है कि ऐसा क्यों है कि तर्क के बिना दो विधियां और एक हैं। मुझे लगता है कि यह कुछ अच्छा अभ्यास है लेकिन कारण के बारे में सोचने में सक्षम नहीं है।

उत्तर

4

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

3

sizeNode ले जाने वाली विधि को दोबारा लागू किया जाता है - यह Node से पेड़ का आकार पाता है। यह बाइनरी पेड़ वर्ग के बाहर ही उपयोगी नहीं है, इसलिए यह private है।

अन्य size विधि पूरे पेड़ के आकार पाता है, और कॉल करने वालों के लिए एक Node में पारित करने के लिए नहीं होना चाहिए; बाइनरी पेड़ पहले से ही जानता है कि इसकी जड़ क्या है। यह रिकर्सिव नहीं है। यह पूरे पेड़ के आकार को प्राप्त करने के लिए root को पार करते हुए अन्य size विधि को प्रस्तुत करता है। यह वर्ग के बाहर बहुत उपयोगी है, इसलिए यह public है।

4

एक public है और एक private है। इसलिए किसी को किसी भी पैरामीटर public int size() के बिना बाहरी रूप से उजागर किया जाता है, और दूसरा केवल आंतरिक रूप से उपयोग किया जाता है और बाहरी रूप से private int size(Node) छुपाया जाता है।

इस अवधारणा को encapsulation कहा जाता है और यह उन आंतरिक विवरणों को छिपाने का कार्य है जिन्हें कक्षा (या पुस्तकालय) के उपयोग को सरल बनाने के प्रयास में सामान्य खपत के संपर्क में आने की आवश्यकता नहीं है।

1

और यह भी तर्क के साथ एक निजी है, इसका मतलब है कि मैं केवल

MyBinaryTree bt = new MyBinaryTree(); 
int treeSize = bt.size(); 

आमतौर पर कोड की तरह कुछ का उपयोग कर सकते पता है कि वे के लिए हैं टिप्पणी कर सकते हैं। कभी-कभी एक साफ कोड को टिप्पणियों की भी आवश्यकता नहीं होती है।

/** 
* Gets the size of the current binary tree. 
*/ 
public int size() { 
    return(size(root)); 
} 
/** 
* Gets the size of the given branch 
* @param node The branch to count from. 
*/ 
private int size(Node node) { 
    if (node == null) return(0); 
    else { 
    return(size(node.left) + 1 + size(node.right)); 
    } 
} 

सिद्धांत रूप में, द्विआधारी पेड़ में बच्चों के साथ सभी शाखाओं भी द्विआधारी पेड़ के रूप में संभाला जा सकता है।

Binary Tree sample

ध्यान दें कि size() तर्क के रूप में रूट नोड के साथ एक दूसरे को कॉल करेंगे, इस मामले में यह एक से शुरू, आंतरिक रूप से यह हो जाएगा गिनती का मतलब है।

Size of the tree is count of items from A 
Items from A are 1 + Items from B + Items from C 
Items from B are 1 
Items from C are 1 + Items from D + items from E 

अब, तुम क्यों एक method with the same name and diferent arguments का प्रयोग करेंगे?

ऐसा करने के लिए कुछ कारण हो सकते हैं या ऐसा नहीं कर सकते हैं। आमतौर पर इसका मतलब है कि कुछ करने के लिए एक से अधिक तरीके हैं या आप डिफ़ॉल्ट रूप से कुछ और उपयोग करना चाहते हैं, इस मामले में, आकार() डिफ़ॉल्ट रूट के रूप में उपयोग करेगा।

संबंधित मुद्दे