Computer >> Máy Tính >  >> Lập trình >> C ++

Truy vấn C ++ cho DFS của cây con trong cây

Trong bài toán này, chúng tôi được cung cấp một cây nhị phân và chúng tôi được yêu cầu thực hiện dfs từ một nút cụ thể, trong đó chúng tôi giả sử nút đã cho là gốc và thực hiện dfs từ nó.

Truy vấn C ++ cho DFS của cây con trong cây

Trong cây trên, giả sử chúng ta được yêu cầu thực hiện DFS từ nút F

Trong hướng dẫn này, chúng tôi sẽ áp dụng một số phương pháp không chính thống để nó sẽ giảm đáng kể độ phức tạp về thời gian của chúng tôi và do đó chúng tôi sẽ có thể chạy mã này cho các ràng buộc cao hơn.

Phương pháp tiếp cận - Trong cách tiếp cận này, chúng tôi sẽ không đơn giản đi theo cách ngây thơ, tức là chúng tôi chỉ áp dụng dfs cho mọi nút vì nó sẽ không hoạt động đối với các ràng buộc cao hơn, vì vậy chúng tôi cố gắng sử dụng một số phương pháp không chính thống để tránh nhận được 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;
}

Đầu ra

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

Hiểu mã

Trong cách tiếp cận này, chúng tôi đang tính toán trước thứ tự của dfs và lưu trữ nó trong một vectơ bây giờ khi chúng tôi đã tính toán trước các dfs, chúng tôi cũng tính toán các nút hiện diện dưới mỗi cây con bắt đầu từ mỗi nút và sau đó chúng tôi chỉ cần duyệt qua chỉ số bắt đầu của nút sau đó cho tất cả số lượng nút hiện diện bên trong cây con của nó.

Kết luận

Trong hướng dẫn này, chúng tôi giải quyết một vấn đề để giải quyết các Truy vấn cho DFS của một cây con trong một cây. Chúng tôi cũng đã học chương trình C ++ cho vấn đề này và cách tiếp cận hoàn chỉnh (Bình thường) mà chúng tôi đã giải quyết vấn đề này.

Chúng ta có thể viết chương trình tương tự bằng các ngôn ngữ khác như C, java, python và các ngôn ngữ khác. Hy vọng bạn thấy bài viết này hữu ích.