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

C++ में निकटतम बाइनरी सर्च ट्री वैल्यू II

मान लीजिए कि हमारे पास एक बाइनरी सर्च ट्री और एक लक्ष्य मान है; हमें उस BST में k मान ज्ञात करना है जो लक्ष्य के सबसे निकट है। हमें यह ध्यान रखना होगा कि लक्ष्य मान एक फ़्लोटिंग-पॉइंट संख्या है। हम मान सकते हैं कि k हमेशा मान्य होता है, और k कुल नोड्स।

तो, अगर इनपुट पसंद है

C++ में निकटतम बाइनरी सर्च ट्री वैल्यू II

लक्ष्य =3.714286, और k =2, तो आउटपुट [4,3]

. होगा

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

  • पुशस्मॉलर () फ़ंक्शन को परिभाषित करें, यह नोड, स्टैक सेंट और लक्ष्य लेगा,

  • जबकि नोड मौजूद नहीं है, करें -

    • यदि नोड का मान <लक्ष्य है, तो -

      • सेंट में नोड डालें

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

    • अन्यथा

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

  • एक फ़ंक्शन पुशलार्जर () को परिभाषित करें, यह नोड, स्टैक सेंट, लक्ष्य,

    . लेगा
  • जबकि नोड खाली है, करें -

    • यदि नोड का मान>=लक्ष्य है, तो −

      • सेंट में नोड डालें

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

    • अन्यथा

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

  • मुख्य विधि से निम्न कार्य करें -

  • एक सरणी रिट परिभाषित करें

  • एक स्टैक को छोटा परिभाषित करें

  • एक स्टैक को बड़ा परिभाषित करें

  • pushLarger(रूट, बड़ा, लक्ष्य)

  • pushSmaller(रूट, छोटा, लक्ष्य)

  • जबकि k गैर-शून्य है, प्रत्येक चरण में k घटाएं, −

    . करें
    • यदि छोटा खाली नहीं है और (बड़ा खाली है या |लक्ष्य - छोटे के शीर्ष तत्व का मान| <|लक्ष्य - बड़े का शीर्ष तत्व|)

      • curr =छोटे का शीर्ष तत्व

      • तत्व को छोटे से हटाएं

      • रिट के अंत में वैल का वैल डालें

      • pushSmaller(बाएं कर्व, छोटा, लक्ष्य)

    • अन्यथा

      • curr =बड़े का शीर्ष तत्व

      • एलिमेंट को बड़े से हटाएं

      • रिट के अंत में वैल का वैल डालें

      • pushSmaller(दाहिने कर्व, बड़ा, लक्ष्य)

  • वापसी रिट

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class TreeNode{
   public:
      int val;
      TreeNode *left, *right;
      TreeNode(int data){
         val = data;
         left = NULL;
         right = NULL;
      }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      }
      else{
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         return;
      }
      else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int> v){
   TreeNode *root = new TreeNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
class Solution {
public:
   vector<int> closestKValues(TreeNode* root, double target, int k) {
      vector<int> ret;
      stack<TreeNode*> smaller;
      stack<TreeNode*> larger;
      pushLarger(root, larger, target);
      pushSmaller(root, smaller, target);
      while (k--) {
         if (!smaller.empty() && (larger.empty() || (abs(target - smaller.top()->val) < abs(target - larger.top()->val)))) {
            TreeNode* curr = smaller.top();
            smaller.pop();
            ret.push_back(curr->val);
            pushSmaller(curr->left, smaller, target);
         }
         else {
            TreeNode* curr = larger.top();
            larger.pop();
            ret.push_back(curr->val);
            pushLarger(curr->right, larger, target);
         }
      }
      return ret;
   }
   void pushSmaller(TreeNode* node, stack <TreeNode*>& st, double target){
      while (node) {
         if (node->val < target) {
            st.push(node);
            node = node->right;
         }
         else {
            node = node->left;
         }
      }
   }
   void pushLarger(TreeNode* node, stack <TreeNode*>& st, double target){
      while (node) {
         if (node->val >= target) {
            st.push(node);
            node = node->left;
         }
         else
            node = node->right;
      }
   }
};
main(){
   Solution ob;
   vector<int> v = {4,2,5,1,3};
   TreeNode *root = make_tree(v);
   print_vector(ob.closestKValues(root, 3.7142, 2));
}

इनपुट

{4,2,5,1,3}, 3.7142, 2

आउटपुट

[4, 3, ]

  1. C++ में बाइनरी ट्री टू बाइनरी सर्च ट्री रूपांतरण

    एक बाइनरी ट्री एक विशेष प्रकार का पेड़ है जिसमें पेड़ के प्रत्येक नोड में अधिकतम दो बच्चे नोड हो सकते हैं। इन चाइल्ड नोड्स को राइट चाइल्ड और लेफ्ट चाइल्ड के रूप में जाना जाता है। एक साधारण बाइनरी ट्री है - बाइनरी सर्च ट्री (BST) एक विशेष प्रकार का वृक्ष है जो निम्नलिखित नियमों का पालन करता है -

  1. C++ में बाइनरी सर्च ट्री में न्यूनतम मान वाला नोड खोजें

    मान लीजिए कि हमारे पास एक बाइनरी सर्च ट्री है। हमें बाइनरी सर्च ट्री में न्यूनतम तत्व खोजना है। तो अगर बीएसटी नीचे जैसा है - न्यूनतम तत्व 1 होगा। जैसा कि हम जानते हैं कि लेफ्ट सबट्री में हमेशा छोटे तत्व होते हैं। इसलिए यदि हम बाएं सबट्री को बार-बार पार करते हैं जब तक कि बाईं ओर शून्य न हो, हम सब

  1. सी ++ प्रोग्राम में बाइनरी सर्च?

    द्विआधारी खोज, जिसे अर्ध-अंतराल खोज, लॉगरिदमिक खोज या बाइनरी चॉप के रूप में भी जाना जाता है, एक खोज एल्गोरिथ्म है जो एक क्रमबद्ध सरणी के भीतर लक्ष्य मान की स्थिति का पता लगाता है। बाइनरी खोज लक्ष्य मान की तुलना सरणी के मध्य तत्व से करती है। यदि वे समान नहीं हैं, तो आधा जिसमें लक्ष्य झूठ नहीं बोल सकत