Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में बीएसटी II में उत्तराधिकारी उत्तराधिकारी

मान लीजिए कि हमारे पास बाइनरी सर्च ट्री में एक नोड है, हमें बीएसटी में उस नोड के इन-ऑर्डर उत्तराधिकारी को खोजना होगा। यदि कोई इन-ऑर्डर उत्तराधिकारी नहीं है, तो अशक्त लौटें। जैसा कि हम जानते हैं कि नोड का उत्तराधिकारी वह नोड होता है जिसकी कुंजी नोड के मान से अधिक होती है।

हमारे पास नोड तक सीधी पहुंच होगी लेकिन पेड़ की जड़ तक नहीं। यहां प्रत्येक नोड के पास उसके मूल नोड का संदर्भ होगा। नीचे नोड की परिभाषा दी गई है -

class Node {
   public int val;
   public Node left;
   public Node right;
   public Node parent;
}

अगर इनपुट इस तरह है -

सी ++ में बीएसटी II में उत्तराधिकारी उत्तराधिकारी

और नोड 2 है, तो आउटपुट 3 होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • यदि नोड का दायां शून्य नहीं है, तो -

    • नोड:=नोड के दाईं ओर

    • जबकि नोड का बायां भाग शून्य नहीं है, करें -

      • नोड :=नोड के बाईं ओर

    • वापसी नोड

  • जबकि (नोड का पैरेंट अशक्त नहीं है और नोड नोड के पैरेंट के बाएं के बराबर नहीं है), करें -

    • नोड:=नोड का जनक

  • वापसी नोड के जनक

उदाहरण

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class Node {
public:
   int val;
   Node* left;
   Node* right;
   Node* parent;
   Node(int v, Node* par = NULL){
      val = v;
      left = NULL;
      right = NULL;
      parent = par;
   }
};
class Solution {
public:
   Node* inorderSuccessor(Node* node) {
      if (node->right) {
         node = node->right;
         while (node->left)
         node = node->left;
         return node;
      }
      while (node->parent && node != node->parent->left) {
         node = node->parent;
      }
      return node->parent;
   }
};
main(){
   Solution ob;
   Node *root = new Node(5);
   root->left = new Node(3, root);
   root->right = new Node(6, root);
   root->left->left = new Node(2, root->left);
   root->left->right = new Node(4, root->left);
   root->left->left->left = new Node(1, root->left->left);
   cout << (ob.inorderSuccessor(root->left->left))->val;
}

इनपुट

Node *root = new Node(5);
root->left = new Node(3, root);
root->right = new Node(6, root);
root->left->left = new Node(2, root->left);
root->left->right = new Node(4, root->left);
root->left->left->left = new Node(1, root->left->left);
(ob.inorderSuccessor(root->left->left))->val

आउटपुट

3

  1. सी ++ में बीएसटी में नोड हटाएं

    मान लीजिए कि हमारे पास एक बाइनरी सर्च ट्री है। हम एक कुंजी k लेंगे, और हमें दिए गए कुंजी k को BST से हटाना होगा, और अद्यतन BST को वापस करना होगा। तो अगर पेड़ जैसा है - और कुंजी k =3, तो आउटपुट ट्री होगा - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - रूट नोड को हटाने के लिए deleteR

  1. C++ में बाइनरी ट्री में नोड का प्रीऑर्डर उत्तराधिकारी

    इस समस्या में, हमें एक बाइनरी ट्री और एक नोड मान दिया जाता है। हमारा काम नोड के प्रीऑर्डर सक्सेसर को प्रिंट करना है। बाइनरी ट्री एक विशेष प्रकार का पेड़ है जिसमें प्रत्येक रूट नोड में अधिकतम 2 चाइल्ड नोड हो सकते हैं। ट्रैवर्सल अग्रिम-आदेश पेड़ के नोड्स को पार करने का एक तरीका है। इसमें हम पहले रूट

  1. C++ में दिए गए BST में प्रत्येक नोड में सभी बड़े मान जोड़ें?

    एक BST या बाइनरी सर्च ट्री बाइनरी ट्री का एक रूप है जिसमें सभी बाएँ नोड छोटे होते हैं और सभी दाएँ नोड मूल मान से अधिक होते हैं। इस समस्या के लिए, हम एक बाइनरी ट्री लेंगे और उसमें वर्तमान नोड से बड़े सभी मान जोड़ेंगे। समस्या बीएसटी में प्रत्येक नोड में सभी बड़े मान जोड़ें को सरल बनाया गया है क्योंकि