在C++中查找树的子树的DFS遍历中的第K个节点
在这个问题中,我们得到一个大小为N的树,树的一个节点V和k。我们的任务是查找树的给定子树的DFS遍历中的第K个节点。
我们需要找到从顶点V开始的树的DFS遍历中的第k个节点。
让我们举个例子来理解这个问题:
输入
V = 2, k = 3
输出:4
解释 -
The series is {1, 2, 3, 5, 6, 7} The 4th element is 5.
解决方案方法
解决这个问题的一个简单方法是找到节点V的DFS遍历并打印其中的第k个值。
为此,我们执行树的DFS遍历并将其存储在一个向量中。在这个向量中,我们将找到Vstart和Vend的值,分别标记树的DFS遍历的开始和结束。然后找到此范围内的第k个值,如果可能,则打印它。
示例
程序说明了我们解决方案的工作原理
#include <bits/stdc++.h> using namespace std; #define N 100005 int n; vector<int> tree[N]; int currentIdx; vector<int> startIdx,endIdx; vector<int> 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]) return 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<<k<<"-th node in DFS traversal of node "<<v<<" is "<<findKNodeDfsV(v, k); return 0; }
输出
4-th node in DFS traversal of node 2 is 1
广告