2015-05-31 8 views
6

मैं बाइनरी सर्च ट्री से नोड को हटाने के लिए एक विधि लिखने की कोशिश कर रहा हूं। नोड को हटाने के लिए मेरी विधि यहां दी गई है।जावा: किसी विधि के भीतर ऑब्जेक्ट को शून्य पर सेट करने का कोई प्रभाव नहीं है (कोड का उपयोग कर रहा है)

public void delete(int deletionNodeValue) { 
    Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue); 
    if(nodeToBeDeleted == null) return; // No node with such value exists throw an error 
    if(isLeafNode(nodeToBeDeleted)) { 
     nodeToBeDeleted = null; 
    } else if (nodeToBeDeleted.getNumChildren() == 1) { 
     bypassNode(nodeToBeDeleted); 
    }else { 
     replace(nodeToBeDeleted, getSuccessor(nodeToBeDeleted.getValue())); 
    } 
} 

मैं एक पत्ता नोड पर इस विधि की जाँच की है, हालांकि डिबगिंग के बाद मुझे पता चला कि nodeToBeSelected=null के निष्पादन होता है, नोड वास्तव में हटाया नहीं गया है। चूंकि मैं अभी भी हटाए गए मूल्य की खोज कर सकता हूं और प्रोग्राम अभी भी इसे लाने के लिए प्रबंधित करता है।

tree.add(5); 
tree.delete(5); 
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted 

यहाँ है मेरी getNode() विधि

public Node<Integer> getNode(int searchValue) { 
    Node<Integer> currentNode = root; 
    while(currentNode != null) { 
     int currentNodeValue = currentNode.getValue(); 
     if(searchValue == currentNodeValue) 
      return currentNode; 
     else if(searchValue < currentNodeValue) 
      currentNode = currentNode.getLeftChild(); 
     else 
      currentNode = currentNode.getRightChild(); 
    } 

    // if no node with given value is found 
    return null; 
} 

getNode() विधि मूल्य द्वारा पाया नोड लौट रहा है? मैं इसे संदर्भ वापस कैसे कर सकता हूं और सीधे नोड में हेरफेर कर सकता हूं?

उत्तर

5

आपको पेड़ से नोड को हटाना होगा, न कि आपके कार्यक्रम में स्थानीय रूप से।

Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue); 

आपको पेड़ में नोड की एक प्रति देता है।

nodeToBeDeleted = null; 

इस प्रति को शून्य में सेट करता है। पेड़ से कनेक्शन हटाया नहीं गया है क्योंकि यह नोड ऑब्जेक्ट का हिस्सा है। कनेक्शन को हटाने के लिए आप एक नोड को हटाने के लिए एक और तरीका लिखने के लिए होता है और इस तरह

parent.leftNode = null; // if nodeToBeDeleted == leftNode 
parent.rightNode = null; // if nodeToBeDeleted == rightNode 
+0

कुछ शामिल करना चाहिए @NashVali मुझे नहीं लगता कि आप 'public' क्षेत्रों के रूप में' परिभाषित करने दिया जाना चाहिए leftNode' और 'rightNode' है ।सेटर्स का उपयोग करना एक बेहतर विकल्प है। – CKing

+0

हां उन्हें सार्वजनिक नहीं होना चाहिए। यह कोड एक काल्पनिक विधि 'void deleteChild (नोड नोडToBeDeleted)' विधि का एक स्निपेट है। – CoronA

+0

काल्पनिक विधि अभी भी काल्पनिक सार्वजनिक क्षेत्रों का उपयोग करने के बजाय काल्पनिक सेटर्स का उपयोग कर सकती है। मेरा जवाब देखें – CKing

4

जब आप कहते हैं कि nodeToBeDeleted = null;delete विधि के अंदर, तुम सच में NodegetNode विधि से लौटे एक null की ओर इशारा करते शुरू करने के लिए कारण नहीं कर रहे हैं।

जावा हमेशा pass-by-value है। इसका अर्थ यह है कि आप विधि के अंदर एक नई मेमोरी लोकेशन के लिए एक विधि बिंदु पर एक संदर्भ पारित नहीं कर सकते हैं। इसी तरह, आप एक विधि कॉल पॉइंट द्वारा किसी अन्य विधि के अंदर एक नई मेमोरी लोकेशन में एक संदर्भ नहीं लौटा सकते हैं। (भले ही स्थान है, ठीक है .. एक शून्य)।

ऊपर स्पष्टीकरण के अनुसार, यह getNode विधि का उपयोग करने Node जिसे आप हटाना और फिर किसी अन्य विधि में एक null को यह नोड बिंदु बनाने के लिए wan't पाने के लिए लगभग असंभव है। delete विधि के अंदर getNode विधि में कोड को डुप्लिकेट करने का एक त्वरित समाधान होगा। Node में आपको setLeftChild और setRightChild विधि जोड़नी चाहिए (जैसा बाएं चाइल्ड और दाएं चाइल्ड सार्वजनिक बनाने के विरोध में दूसरों द्वारा प्रस्तावित किया गया है)। इसके बाद आप अशक्त करने के लिए सेट कर सकते हैं इस प्रकार है:

nodeToBeDeleted.setLeftChild(null)

4

जब आप null को nodeToBeDeleted निर्धारित करते हैं, आप केवल स्थानीय चर कि वास्तविक वस्तु के संदर्भ रखती का मूल्य निर्धारित किया है। वास्तविक वस्तु किसी भी तरह से हटाई नहीं गई है।

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

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