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

C++ में दूषित बाइनरी ट्री में तत्व खोजें


मान लीजिए हमारे पास एक बाइनरी ट्री है। उस ट्री के नियम इस प्रकार हैं:

  • root.val == 0

  • यदि treeNode.val x है और treeNode.left null नहीं है, तो treeNode.left.val = 2 * x + 1

  • यदि treeNode.val x है और treeNode.right null नहीं है, तो treeNode.right.val = 2 * x + 2

अब चूंकि बाइनरी ट्री दूषित है। यह इंगित करता है कि ट्री नोड के सभी मान -1 में बदल दिए गए हैं। हमें पहले बाइनरी ट्री को पुनर्प्राप्त करना होगा और फिर FindElements क्लास को इस प्रकार लागू करना होगा:

  • FindElements(TreeNode* root) दूषित बाइनरी ट्री के साथ ऑब्जेक्ट को प्रारंभ करता है, हमें पहले इसे पुनर्प्राप्त करना होगा।

  • bool find(int target)। यह लौटाएगा कि लक्ष्य मान पुनर्प्राप्त बाइनरी ट्री में मौजूद है या नहीं।

इसलिए यदि ट्री इस तरह है:

C++ में दूषित बाइनरी ट्री में तत्व खोजें


इसलिए पुनर्प्राप्त करने के बाद, यदि हम 1, 3 और 5 को खोजने का प्रयास करते हैं, तो परिणाम true, true और false होंगे।

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

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

  • एक dfs() विधि परिभाषित करें, यह root और rootVal लेगा। rootVal प्रारंभ में -1 है

  • यदि root null है, तो लौटें

  • यदि rootVal -1 है, तो root का मान 0 पर सेट करें, अन्यथा इसे rootVal पर सेट करें

  • root के मान को a में सम्मिलित करें

  • dfs(left of root, 2* root का मान + 1), dfs(right of root, 2* root का मान + 2) कॉल करें

  • प्रारंभिककरण (या पुनर्निर्माण) के लिए, हम dfs(root, -1) कॉल करेंगे

  • किसी तत्व को खोजने के लिए, जांचें कि तत्व a में होगा या नहीं, यदि हां तो true लौटाएं, अन्यथा false।

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;

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 FindElements {
public:
    set <int> a;
    void dfs(TreeNode* root, int rootVal = -1) {
        if(!root) return;
        root->val = rootVal == -1 ? 0 : rootVal;
        a.insert(root->val);
        dfs(root->left, 2 * root->val + 1);
        dfs(root->right, 2 * root->val + 2);
    }
    FindElements(TreeNode* root) {
        dfs(root);
    }
    bool find(int t) {
        return a.find(t) != a.end();
    }
};

int main() {
    vector<int> v = {-1,-1,-1,-1,-1};
    TreeNode *root = make_tree(v);
    FindElements ob(root);
    cout << (ob.find(1)) << endl;
    cout << (ob.find(3)) << endl;
    cout << (ob.find(5)) << endl;
}

इनपुट

ट्री को [-1,-1,-1,-1,-1] से प्रारंभ करें, फिर find(1), find(3) और find(5) कॉल करें

आउटपुट

1 1 0
  1. C++ में अधिकतम बाइनरी ट्री II C++ में अधिकतम बाइनरी ट्री II

    मान लीजिए हमारे पास एक अधिकतम ट्री का रूट नोड है: अधिकतम ट्री एक ट्री है जहां प्रत्येक नोड का मान उसके सबट्री में किसी भी अन्य मान से अधिक होता है। मान लीजिए हमारे पास construct() नामक एक विधि है। यह सूची A से एक रूट बना सकती है। construct() विधि इस तरह है: यदि सूची A खाली है, तो null लौटाएं। अन्य

  1. C++ में बाइनरी ट्री को लिंक्ड लिस्ट में फ्लैट करना C++ में बाइनरी ट्री को लिंक्ड लिस्ट में फ्लैट करना

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें इसे स्थानांतरित (in-place) करके लिंक्ड लिस्ट में बदलना है (दायाँ पॉइंटर अगले नोड को इंगित करे, बायाँ पॉइंटर null हो)। उदाहरण: ट्री [1,2,5,3,4] → फ्लैट लिस्ट: 1→2→3→4→5 (प्रीऑर्डर ट्रैवर्सल क्रम)। रिवर्स प्रीऑर्डर ट्रैवर्सल ग्लोबल prev = null रखें। रिकर

  1. बाइनरी ट्री में रूट से दिए गए नोड तक की दूरी खोजें C++ में बाइनरी ट्री में रूट से दिए गए नोड तक की दूरी खोजें C++ में

    मान लीजिए हमारे पास कुछ नोड्स के साथ एक बाइनरी ट्री है। हमें रूट और दूसरे नोड u के बीच की दूरी खोजनी है। मान लीजिए ट्री नीचे जैसा है: अब (रूट, 6) के बीच की दूरी = 2, पथ की लंबाई 2 है, (रूट, 8) के बीच की दूरी = 3 आदि। इस समस्या को हल करने के लिए, हम नोड को बाएं और दाएं सबट्री में खोजने के लिए एक पुन