यदि आप दूर से देखें तो पेड़ से नोड को हटाना काफी जटिल है। नोड को हटाते समय विचार करने के लिए 3 मामले हैं। निम्नलिखित फ़ंक्शन की टिप्पणी में इनका उल्लेख किया गया है। जैसा कि हम पहले करते रहे हैं, हम कक्षा में एक विधि और पुनरावर्ती कॉल करने के लिए एक सहायक बनाएंगे।
कक्षा पद्धति
deleteNode(key) {// यदि कोई नोड सफलतापूर्वक हटा दिया जाता है, तो एक संदर्भ प्राप्त होगा। वापसी !(deleteNodeHelper(this.root, key) ===false);}
सहायक विधि
/** * रूट और कुंजी लेता है और कुंजी के लिए पुनरावर्ती खोज करता है। * यदि यह कुंजी पाता है, तो 3 मामले हो सकते हैं:* * 1. यह नोड एक लीफ नोड है। * *उदाहरण:F * A * / \ * B C * / / \ * D E F * * को हटाने के लिए, हम इसके माता-पिता के कनेक्शन को आसानी से हटा सकते हैं। * *ए */\ * बी सी *//* डी ई * * 2. यह नोड कहीं एक बच्चे के साथ पेड़ के बीच में है। * * उदाहरण:बी * ए * / \ * बीसी * / / \ * डीईएफ * * को हटाने के लिए, हम उपरोक्त कनेक्शन में केवल चाइल्ड नोड को पैरेंट नोड की जगह ले सकते हैं * ए * / \ * डीसी * / \ * EF * * 3. इस नोड में दोनों बच्चे हैं। यह पेचीदा मामला है। * * उदाहरण:सी * * ए * / \ * बीसी * / / \ * डीईएफ * / / \ * जीएचआई * * को हटाना इस मामले में, हमें नोड के उत्तराधिकारी या पूर्ववर्ती को ढूंढना होगा और इस नोड को इसके साथ बदलना होगा * वह। उदाहरण के लिए, यदि हम उत्तराधिकारी के साथ जाते हैं, तो इसका उत्तराधिकारी इससे बड़ा तत्व होगा, * यानी, सही उपट्री में न्यूनतम तत्व। तो हटाने के बाद, पेड़ इस तरह दिखेगा:* * ए * / \ * बीएच * / / \ * डीईएफ * / \ * जीआई * * इस तत्व को हटाने के लिए, हमें उत्तराधिकारी के माता-पिता को खोजने की जरूरत है, उनके लिंक को तोड़ दें, उत्तराधिकारी के बाएँ * और दाएँ बिंदु को वर्तमान नोड के बाएँ और दाएँ बिंदु बनाएँ। आसान तरीका यह है कि नोड से डेटा को केवल * उत्तराधिकारी से हटा दिया जाए और उत्तराधिकारी को हटा दिया जाए। } अगर (कुंजीरूट.डेटा) {root.right =deleteNodeHelper(root.right, key); वापसी जड़; } और {// नो चिल्ड्रन // केस 1 - एक लीफ नोड अगर (रूट। लेफ्ट ===नल &&रूट। राइट ===नल) {रूट =नल; वापसी जड़; } // सिंगल चाइल्ड केस अगर (root.left ===null) root.right लौटाते हैं; अगर (रूट। राइट ===नल) रूट लौटाएं। बाएं; // दोनों बच्चे, इसलिए उत्तराधिकारी खोजने की जरूरत है currNode =root.right; जबकि (currNode.left!==null) { currNode =currNode.left; } root.data =currNode.data; // राइट सबट्री से वैल्यू डिलीट करें। root.right =deleteNodeHelper (root.right, currNode.data); वापसी जड़; }}पूर्व> आप इसका परीक्षण कर सकते हैं -
उदाहरण
बीएसटी =नया बाइनरीसर्च ट्री (); बीएसटी.insertRec (10); BST.insertRec (15); BST.insertRec (5); BST.insertRec (50); BST.insertRec (3); BST.insertRec ( 7); BST.insertRec(12); BST.inOrder();BST.deleteNode(15);BST.deleteNode(10);BST.deleteNode(3);BST.inOrder();आउटपुट
यह आउटपुट देगा -
571250