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

C++-এ দুটি বাইনারি ট্রি মার্জ করা

যখন দুটি বাইনারি ট্রিকে একে অপরের ওপর রাখা হয়, তবে কিছু নোড ওভারল্যাপ করে এবং অন্যগুলো না করে। এই দুটি ট্রিকে একটি নতুন বাইনারি ট্রিতে মার্জ করতে হবে। মার্জের নিয়ম হলো: যদি দুটি নোড ওভারল্যাপ করে, তবে তাদের মান যোগ করে মার্জ করা নোডের নতুন মান তৈরি করা হবে। অন্যথায়, খালি ন হওয়া নোডটিই নতুন ট্রির নোড হিসেবে ব্যবহার করা হবে।

উদাহরণ (C++)

নিচের বাস্তবায়নটি দেখে বিষয়টি ভালোভাবে বুঝা যাবে:

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

class TreeNode { 
public: 
    int val; 
    TreeNode *left, *right; 
    TreeNode(int data) { 
        val = data; 
        left = 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) { 
            temp->left = new TreeNode(val); 
            return; 
        } else { 
            q.push(temp->left); 
        } 
        if(!temp->right) { 
            temp->right = new TreeNode(val); 
            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->val == 0) { 
                cout << "null" << ", "; 
            } else { 
                cout << curr->val << ", "; 
            } 
        } 
    } 
    cout << "]" << endl; 
} 

class Solution { 
public: 
    TreeNode* mergeTrees(TreeNode* n1, TreeNode* n2) { 
        if(!n1 && n2) { 
            return n2; 
        } else if(!n2 && n1) return n1; 
        else if(!n1 && !n2) return NULL; 
        n1->val += n2->val; 
        n1->left = mergeTrees(n1->left, n2->left); 
        n1->right = mergeTrees(n1->right, n2->right); 
        return n1; 
    } 
}; 

int main() { 
    Solution ob; 
    vector<int> v1 = {1,3,2,5}; 
    vector<int> v2 = {2,1,3,NULL,4,NULL,7}; 
    TreeNode *root1 = make_tree(v1); 
    TreeNode *root2 = make_tree(v2); 
    root1 = ob.mergeTrees(root1, root2); 
    tree_level_trav(root1); 
    return 0; 
}

ইনপুট

[1,3,2,5] [2,1,3,null,4,null,7]

আউটপুট

[3, 4, 5, 5, 4, null, 7, ]
  1. ফ্লিপ সমতুল্য বাইনারি ট্রি C++-এ

  2. C++-এ ইউনিক বাইনারি সার্চ ট্রি গণনা

  3. C++-এ ইউনিক বাইনারি সার্চ ট্রি II - সব ট্রি জেনারেট করা

  4. C++-এ দুটি বাইনারি ট্রির প্রথম অমিল লীফ নোড (Non-matching Leaves) খুঁজে বের করা