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

Tìm nút thứ K trong đường truyền DFS của cây con đã cho trong Cây trong C ++

Trong bài toán này, chúng ta được đưa ra một cây có kích thước N, một nút của cây V và k. Nhiệm vụ của chúng ta là tìm nút thứ K trong đường truyền DFS của một cây con đã cho trong Cây .

Chúng ta cần tìm nút thứ k trong đường truyền DFS của cây bắt đầu từ đỉnh V.

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào:

Tìm nút thứ K trong đường truyền DFS của cây con đã cho trong Cây trong C ++

V =2, k =3

Đầu ra:4

Giải thích -

 Chuỗi là {1, 2, 3, 5, 6, 7} Phần tử thứ 4 là 5. 

Phương pháp tiếp cận giải pháp

Một giải pháp đơn giản cho vấn đề là tìm đường truyền DFS của nút V và in giá trị thứ k từ nút này.

Đối với điều này, chúng tôi thực hiện duyệt DFS của cây và lưu trữ nó trong một vectơ. Trong vectơ này, chúng tôi sẽ tìm các giá trị cho V start và V end đánh dấu điểm bắt đầu và kết thúc của quá trình truyền DFS của cây. Sau đó, tìm giá trị thứ k trong phạm vi này và in nó nếu có thể.

Ví dụ

Chương trình minh họa hoạt động của giải pháp của chúng tôi

 #include  using namespace std; #define N 100005int n; vector  tree [N]; int currentIdx; vector  startIdx, endIdx; vector  dfsTraversalVector; void insertEdge (int u, int v) {tree [u] .push_back (v); tree [v] .push_back (u);} void findDfsTraversal (int ch, int par) {dfsTraversalVector [currentIdx] =ch; startIdx [ch] =currentIdx ++; for (auto c:tree [ch]) {if (c! =par) findDfsTraversal (c, ch); } endIdx [ch] =currentIdx - 1;} int findKNodeDfsV (int v, int k) {k =k + (startIdx [v] - 1); if (k <=endIdx [v]) trả về dfsTraversalVector [k]; return -1;} int main () {n =9; insertEdge (5, 8); insertEdge (5, 2); insertEdge (5, 10); insertEdge (5, 3); insertEdge (2, 6); insertEdge (2, 1); insertEdge (3, 9); insertEdge (6, 1); insertEdge (9, 7); startIdx.resize (n); endIdx.resize (n); dfsTraversalVector.resize (n); findDfsTraversal (5, 0); int v =2, k =4; cout < 

Đầu ra

Nút thứ 4 trong DFS của nút 2 là 1