Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

คิวรี C++ สำหรับ DFS ของทรีย่อยในทรี


ในปัญหานี้ เราได้รับไบนารีทรีและเราจำเป็นต้องดำเนินการ dfs จากโหนดใดโหนดหนึ่ง ซึ่งเราถือว่าโหนดที่กำหนดเป็นรูทและดำเนินการ dfs จากโหนดนั้น

คิวรี C++ สำหรับ DFS ของทรีย่อยในทรี

ในแผนผังด้านบน สมมติว่าเราต้องดำเนินการ DFS จากโหนด F

ในบทช่วยสอนนี้ เราจะใช้วิธีการนอกรีตบางอย่างเพื่อลดความซับซ้อนของเวลาอย่างมาก ดังนั้นเราจึงสามารถเรียกใช้โค้ดนี้สำหรับข้อจำกัดที่สูงขึ้นด้วย

แนวทาง − ในแนวทางนี้ เราจะไม่เพียงแค่ไปในทางที่ไร้เดียงสา เช่น ที่เราเพียงแค่ใช้ 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 ล่วงหน้าแล้ว เรายังคำนวณโหนดที่มีอยู่ภายใต้ทรีย่อยแต่ละอันโดยเริ่มจากแต่ละโหนด จากนั้นเราเพียงแค่สำรวจจากดัชนีเริ่มต้นของโหนดนั้นไปยังทั้งหมด จำนวนโหนดที่มีอยู่ในทรีย่อย

บทสรุป

ในบทช่วยสอนนี้ เราแก้ปัญหาเพื่อแก้ปัญหาการสืบค้นข้อมูลสำหรับ DFS ของทรีย่อยในทรี นอกจากนี้เรายังได้เรียนรู้โปรแกรม C++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ ( Normal) ซึ่งเราแก้ปัญหานี้ได้

เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ หวังว่าบทความนี้จะเป็นประโยชน์