কম্পিউটার

একটি গাছে একটি সাবট্রির ডিএফএসের জন্য C++ প্রশ্ন


এই সমস্যায় আমাদের একটি বাইনারি ট্রি দেওয়া হয়েছে এবং আমাদের একটি নির্দিষ্ট নোড থেকে dfs করতে হবে যেখানে আমরা প্রদত্ত নোডটিকে রুট হিসাবে ধরে নিই এবং এটি থেকে dfs সম্পাদন করি৷

একটি গাছে একটি সাবট্রির ডিএফএসের জন্য C++ প্রশ্ন

উপরের গাছে ধরুন আমাদের নোড F

থেকে DFS করতে হবে

এই টিউটোরিয়ালে আমরা কিছু অপ্রচলিত পদ্ধতি প্রয়োগ করতে যাচ্ছি যাতে এটি আমাদের সময়ের জটিলতাকে উল্লেখযোগ্যভাবে হ্রাস করবে এবং এইভাবে আমরা উচ্চতর সীমাবদ্ধতার জন্যও এই কোডটি চালাতে সক্ষম হব।

পন্থা − এই পদ্ধতিতে আমরা কেবল সরল পথে যেতে যাচ্ছি না, যেখানে আমরা প্রতিটি নোডের জন্য কেবল dfs প্রয়োগ করি কারণ এটি উচ্চতর সীমাবদ্ধতার জন্য কাজ করবে না তাই আমরা TLE পাওয়া এড়াতে কিছু অপ্রচলিত পদ্ধতি ব্যবহার করার চেষ্টা করি।

#include <bits/stdc++.h>
using namespace std;
#define N 100000
// Adjacency list to store the
// tree nodes connections
vector<int> v[N];
unordered_map<int, int> mape; // will be used for associating the node with it's index
vector<int> a;
void dfs(int nodesunder[], int child, int parent){ // function for dfs and     precalculation our nodesunder
    a.push_back(child); // storing the dfs of our tree
    // nodesunder of child subtree
    nodesunder[child] = 1;
    for (auto it : v[child]) { // performing normal dfs

        if (it != parent) { // as we the child can climb up to
        //it's parent so we are trying to avoid that as it will become a cycle
            dfs(nodesunder, it, child); // recursive call
            nodesunder[child] += nodesunder[it]; // storing incrementing the nodesunder
        //by the number of nodes under it's children
        }
    }
}
// Function to print the DFS of subtree of node
void printDFS(int node, int nodesunder[]){
    int ind = mape[node]; // index of our node in the dfs array
    cout << "The DFS of subtree " << node << ": ";
    // print the DFS of subtree
    for (int i = ind; i < ind + nodesunder[node]; i++){ // going through dfs array and then
    //printing all the nodes under our given node
        cout << a[i] << " ";
    }
    cout << endl;
}
void addEdgetoGraph(int x, int y){ // for maintaining adjacency list
    v[x].push_back(y);
    v[y].push_back(x);
}
void mark(){ // marking each node with it's index in dfs array
    int size = a.size();
    // marks the index
    for (int i = 0; i < size; i++) {
       mape[a[i]] = i;
    }
}
int main(){
    int n = 7;
    // add edges of a tree
    addEdgetoGraph(1, 2);
    addEdgetoGraph(1, 3);
    addEdgetoGraph(2, 4);
    addEdgetoGraph(2, 5);
    addEdgetoGraph(4, 6);
    addEdgetoGraph(4, 7);
    // array to store the nodes present under of subtree
    // of every node in a tree
    int nodesunder[n + 1];
    dfs(nodesunder, 1, 0); // generating our nodesunder array
    mark(); // marking the indices in map
    // Query 1
    printDFS(2, nodesunder);
    // Query 2
    printDFS(4, nodesunder);
    return 0;
}

আউটপুট

The DFS of subtree 2: 2 4 6 7 5
The DFS of subtree 4: 4 6 7

কোড বোঝা

এই পদ্ধতিতে আমরা dfs-এর ক্রম পূর্ব গণনা করছি এবং এখন এটি একটি ভেক্টরে সংরক্ষণ করছি যখন আমরা dfs-এর পূর্বনির্ধারণ করেছি তখন আমরা প্রতিটি নোড থেকে শুরু করে প্রতিটি সাবট্রির নীচে উপস্থিত নোডগুলিও গণনা করি এবং তারপরে আমরা কেবল নোডের প্রারম্ভিক সূচকটি সকলের কাছে অতিক্রম করি। এর সাবট্রির ভিতরে উপস্থিত নোডের সংখ্যা।

উপসংহার

এই টিউটোরিয়ালে, আমরা একটি গাছের সাবট্রির ডিএফএস-এর জন্য প্রশ্নগুলি সমাধান করার জন্য একটি সমস্যার সমাধান করেছি। আমরা এই সমস্যার জন্য C++ প্রোগ্রাম এবং সম্পূর্ণ পদ্ধতি (সাধারণ) শিখেছি যার মাধ্যমে আমরা এই সমস্যার সমাধান করেছি।

আমরা অন্যান্য ভাষা যেমন সি, জাভা, পাইথন এবং অন্যান্য ভাষায় একই প্রোগ্রাম লিখতে পারি। আশা করি আপনি এই নিবন্ধটি সহায়ক বলে মনে করেন৷


  1. C++ প্রোগ্রামে একটি গাছে পূর্বপুরুষ-বংশের সম্পর্কের জন্য প্রশ্ন

  2. C++ এ উল্টানো সাবট্রি

  3. C++ এ বাইনারি ট্রি প্রিন্ট করুন

  4. একটি বাইনারি গাছ C++ এ অন্য বাইনারি গাছের সাবট্রি কিনা তা পরীক্ষা করুন