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

क्लोजेस्ट बाइनरी सर्च ट्री वैल्यू II - C++


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

तो, यदि इनपुट इस तरह है

क्लोजेस्ट बाइनरी सर्च ट्री वैल्यू II - C++

target = 3.714286, और k = 2, तो आउटपुट [4,3] होगा

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

  • pushSmaller() नामक एक फ़ंक्शन परिभाषित करें, जो node, stack st, और target लेगा,

  • जब तक node मौजूद नहीं है, करें −

    • यदि node का val < target, तो −

      • node को st में डालें

      • node := node का right

    • अन्यथा

      • node := node का left

  • pushLarger() नामक एक फ़ंक्शन परिभाषित करें, जो node, stack st, target लेगा,

  • जब तक node खाली नहीं है, करें −

    • यदि node का val >= target, तो −

      • node को st में डालें

      • node := node का left

    • अन्यथा

      • node := node का right

  • मुख्य विधि से निम्नलिखित करें −

  • एक ऐरे ret परिभाषित करें

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

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

  • pushLarger(root, larger, target)

  • pushSmaller(root, smaller, target)

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

    • यदि smaller खाली नहीं है और (larger खाली है या |target - smaller के शीर्ष तत्व का मान| < |target - larger के शीर्ष तत्व|)

      • curr = smaller का शीर्ष तत्व

      • smaller से तत्व हटाएं

      • curr के val को ret के अंत में डालें

      • pushSmaller(curr का left, smaller, target)

    • अन्यथा

      • curr = larger का शीर्ष तत्व

      • larger से तत्व हटाएं

      • curr के val को ret के अंत में डालें

      • pushSmaller(curr का right, larger, target)

  • ret लौटाएं

उदाहरण 

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

#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++ में बाइनरी ट्री को बाइनरी सर्च ट्री में रूपांतरण C++ में बाइनरी ट्री को बाइनरी सर्च ट्री में रूपांतरण

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

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

    मान लीजिए हमारे पास एक बाइनरी सर्च ट्री है। हमें बाइनरी सर्च ट्री में न्यूनतम तत्व ढूंढना है। इसलिए यदि BST नीचे की तरह है: न्यूनतम तत्व 1 होगा। जैसा कि हम जानते हैं कि बायां उपट्री हमेशा छोटे तत्वों को धारण करता है। इसलिए यदि हम बाएं उपट्री के माध्यम से तब तक ट्रैवर्स करते हैं जब तक बायां NULL नही

  1. C++ में बाइनरी खोज प्रोग्राम C++ में बाइनरी खोज प्रोग्राम

    बाइनरी खोज क्या है? बाइनरी खोज (आधा-अंतराल खोज) एक खोज एल्गोरिदम है जो क्रमबद्ध सरणी में लक्ष्य मान की स्थिति ढूंढता है। यह लक्ष्य मान की तुलना मध्य तत्व से करता है और खोज स्थान को आधा कर देता है। मुख्य बिंदु केवल क्रमबद्ध सरणी पर काम करता है समय जटिलता: O(log n) दुनिया के सभी नाम क्रमबद्ध हों तो