কম্পিউটার টিউটোরিয়াল

C++-এ বাইনারি সার্চ ট্রি রিকভারি (Recover Binary Search Tree)


ধরুন আমাদের কাছে একটি বাইনারি সার্চ ট্রি (BST) আছে, যাতে দুটি নোডের মান বদলিয়ে দেওয়া হয়েছে। আমাদের কাজ হল এই BST কে পুনরুদ্ধার করা।

যদি দেওয়া ট্রি নিচের প্রথম ছবির মতো হয়, তবে রিকভার করার পর দ্বিতীয় ছবির মতো হবে।

C++-এ বাইনারি সার্চ ট্রি রিকভারি (Recover Binary Search Tree)

সমাধানের ধাপগুলো:

  • prev, first, second নামে তিনটি নোড রেফারেন্স সংজ্ঞায়িত করুন।

  • findProblem() নামে একটি মেথড তৈরি করুন যা একটি নোড গ্রহণ করবে।

  • যদি নোড null হয়, তবে রিটার্ন করুন।

  • findProblem(node->left) কল করুন।

  • যদি prev null না হয় এবং prev->val > node->val হয়, তবে:

    • যদি first null হয়, তবে first = prev

    • second = node

  • prev = node সেট করুন।

  • findProblem(node->right) কল করুন।

  • মূল ফাংশন থেকে prev, first, second কে null দিয়ে ইনিশিয়ালাইজ করুন, findProblem(root) কল করুন এবং first ও second নোডের মান বদলিয়ে দিন।

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশনটি দেখুন:

#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; 
} 

void tree_level_trav(TreeNode* root) { 
    if (root == NULL) return; 
    cout << "["; 
    queue<TreeNode*> q; 
    TreeNode *curr; 
    q.push(root); 
    q.push(NULL); 
    while (q.size() > 1) { 
        curr = q.front(); 
        q.pop(); 
        if (curr == NULL) { 
            q.push(NULL); 
        } else { 
            if(curr->left) q.push(curr->left); 
            if(curr->right) q.push(curr->right); 
            if(curr == NULL || curr->val == 0) cout << "null" << ", "; 
            else cout << curr->val << ", "; 
        } 
    } 
    cout << "]" << endl; 
} 

class Solution { 
public: 
    TreeNode* prev; 
    TreeNode* first; 
    TreeNode* second; 
    
    void swapValue(TreeNode* first, TreeNode* second) { 
        int x = first->val; 
        first->val = second->val; 
        second->val = x; 
    } 
    
    void findProblem(TreeNode* node) { 
        if(!node || node->val == 0) return; 
        findProblem(node->left); 
        if((prev != NULL && prev->val != 0) && prev->val > node->val) { 
            if(!first) first = prev; 
            second = node; 
        } 
        prev = node; 
        findProblem(node->right); 
    } 
    
    void recoverTree(TreeNode* root) { 
        prev = first = second = NULL; 
        findProblem(root); 
        swapValue(first, second); 
    } 
}; 

int main() { 
    vector<int> v = {1, 3, NULL, NULL, 2}; 
    TreeNode *root = make_tree(v); 
    Solution ob; 
    ob.recoverTree(root); 
    tree_level_trav(root); 
    return 0;
}

ইনপুট

{1,3,NULL,NULL,2}

আউটপুট

[3, 1, null, null, 2, ]
  1. C++-এ Binary Search Tree-এ নোড ইনসার্ট করা

  2. C++-এ বাইনারি সার্চ ট্রি ইটারেটর (Binary Search Tree Iterator)

  3. C++-এ বাইনারি ট্রি থেকে বাইনারি সার্চ ট্রি (BST) কনভার্ট করুন

  4. বাইনারি সার্চ C++ প্রোগ্রামে