কম্পিউটার

C++-এ নিকটতম বাইনারি অনুসন্ধান ট্রি মান II


ধরুন আমাদের একটি বাইনারি সার্চ ট্রি এবং একটি টার্গেট মান আছে; আমাদের সেই BST-তে k মানগুলি খুঁজে বের করতে হবে যা লক্ষ্যের সবচেয়ে কাছাকাছি। আমাদের মনে রাখতে হবে লক্ষ্য মান হল একটি ফ্লোটিং-পয়েন্ট সংখ্যা। আমরা অনুমান করতে পারি k সর্বদা বৈধ, এবং k ≤ মোট নোড।

সুতরাং, যদি ইনপুট মত হয়

C++-এ নিকটতম বাইনারি অনুসন্ধান ট্রি মান II

লক্ষ্য =3.714286, এবং k =2, তাহলে আউটপুট হবে [4,3]

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি ফাংশন সংজ্ঞায়িত করুন pushSmaller(), এটি নোড, স্ট্যাক st, এবং লক্ষ্য গ্রহণ করবে,

  • যখন নোড উপস্থিত না থাকে, −

    করুন
    • যদি নোডের ভ্যাল <টার্গেট, তাহলে −

      • st

        -এ নোড সন্নিবেশ করান
      • নোড :=নোডের ডানদিকে

    • অন্যথায়

      • নোড :=নোডের বাম

  • একটি ফাংশন pushLarger() সংজ্ঞায়িত করুন, এটি নোড, স্ট্যাক স্ট্যাক, টার্গেট,

    নেবে
  • যখন নোড খালি থাকে, −

    করুন
    • যদি নোডের ভ্যাল>=টার্গেট, তাহলে −

      • st

        -এ নোড সন্নিবেশ করান
      • নোড :=নোডের বাম

    • অন্যথায়

      • নোড :=নোডের ডানদিকে

  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -

  • একটি অ্যারে ret সংজ্ঞায়িত করুন

  • একটি স্ট্যাক ছোট সংজ্ঞায়িত করুন

  • একটি স্ট্যাক বড় সংজ্ঞায়িত করুন

  • pushLarger(মূল, বড়, লক্ষ্য)

  • pushSmaller(মূল, ছোট, লক্ষ্য)

  • k যখন শূন্য নয়, প্রতিটি ধাপে k কমিয়ে দিন −

    • যদি ছোটটি খালি না হয় এবং (বড়টি খালি হয় বা | টার্গেট - ছোটটির শীর্ষ উপাদানের মান | <|target - top element of larger|)

      • curr =ছোটের শীর্ষ উপাদান

      • ছোট থেকে উপাদান মুছুন

      • ret এর শেষে curr এর val সন্নিবেশ করুন

      • pushSmaller(curr-এর বামে, ছোট, লক্ষ্য)

    • অন্যথায়

      • curr =বড় অংশের শীর্ষ উপাদান

      • বড় থেকে উপাদান মুছুন

      • ret এর শেষে curr এর val সন্নিবেশ করুন

      • pushSmaller(curr-এর ডানদিকে, বড়, লক্ষ্য)

  • রিটার্ন রিটার্ন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#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++ এ বাইনারি সার্চ ট্রি ইটারেটার

  2. C++ এ বাইনারি ট্রি থেকে বাইনারি সার্চ ট্রি কনভার্সন

  3. C++ এ বাইনারি সার্চ ট্রিতে ন্যূনতম মান সহ নোড খুঁজুন

  4. C++ প্রোগ্রামে বাইনারি অনুসন্ধান?