在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

更新于:2022年1月28日

118 次浏览

开始您的职业生涯

通过完成课程获得认证

开始
广告