树节点之间的最大距离中的运行时错误

Runtime error in Largest Distance between nodes of a Tree

本文关键字:运行时错误 距离 之间 树节点      更新时间:2023-10-16

这是一个 interviewbit.com 问题 https://www.interviewbit.com/problems/largest-distance-between-nodes-of-a-tree/:

给定一个由 N (2 <= N <= 40000( 节点组成的任意未加权根树。该问题的目标是找到树中两个节点之间的最大距离。两个节点之间的距离是节点之间路径上的许多条边(任何一对节点之间都会有一条唯一的路径,因为它是一棵树(。节点的编号为 0 到 N - 1。

我正在使用 dfs 找到一个离根节点最远的节点。从这个节点,我正在做DFS来找到最远的节点。这个距离是必需的答案。我实现了它,但是在调用do_dfs函数时,我遇到了分段错误。我在每一行之后都写了 return 语句,以找出我在哪里出错。我已经在代码的注释中指出了这一行。

pair<int,int> do_dfs(vector<vector<int>> &adj, int n, int root)
{
int l1 = 0;
stack<pair<int,int>> st;
st.push(make_pair(root,0));
vector<int> vis(n,-1); 
vis[root]=1;  //This statement is causing segmentation fault
int longest=-1;
while(!st.empty())
{
int top=st.top().first , l=st.top().second;
int x=-1;
for(int i=0;i<adj[top].size();++i)
{
int node = adj[top][i];
if(vis[node] ==-1)
{
x = node;
st.push(make_pair(node,l+1));
vis[node]=1;
break;
}
}
if(x==-1)
{
if(l>l1)
{
l1 = l;
longest = top;
}
st.pop();
}
}
return make_pair(longest,l1);
}

int Solution::solve(vector<int> &A) 
{
if(A.size()<3)return (A.size()-1);
vector<vector<int>> adj(A.size());
int root;
for(int i=1;i<A.size();++i)
{
if(A[i]==-1)
{
root = i;
continue;
}
adj[i].push_back(A[i]);
adj[A[i]].push_back(i);
}
//adjacent list for graph complete
pair<int,int> d1=do_dfs(adj,A.size(),root) ;
pair<int,int> d2 = do_dfs(adj, A.size(), d1.first);
int ans = d2.second;
return ans;
}

镶嵌案例 :- A : [ -1, 0, 0, 1, 2, 1, 5 ] 预期输出 : 5

A : [ -1, 0, 0, 0, 3 ] 预期输出 : 3

更改Solution::solve(vector<int> &A)中的行:

for(int i = 1 ; i < A.size() ; ++i)

自:

for(int i = 0; i < A.size() ; ++i)

您的问题得到了解决。

问题是您没有完全迭代给定的A数组。您从索引1开始迭代,而数组从索引0A.size() - 1。因此,您的邻接列表无法正确构造,并且在某些情况下root变量保持未初始化状态。所以你遇到了Runtime error.