题解 | #多叉树的直径#
多叉树的直径
https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3
题目不难,多叉树的后序遍历
难点在于输入给的是边的形式,两个相邻点(没有区分父亲和孩子)还有对应边的权值
所以第一步就是将输入转化为无向图(邻接表形式)
第二步找到任意一个入度为0的顶点,即树的根。
第三步图的深度优先遍历。struct edge{
int value;
int nextp;
edge():value(0),nextp(0){};
edge(int n,int v):value(v),nextp(n){}
};
class Solution {
public:
/**
* 树的直径
* @param n int整型 树的节点个数
* @param Tree_edge Interval类vector 树的边
* @param Edge_value int整型vector 边的权值
* @return int整型
*/
int dis(map<int ,vector<edge>> &graph,int &res,int root,map<int,int> &visit){
int tempmax1=0,tempmax2=0;
visit[root]=1;
if(graph[root].size()==0)
return 0;
for(int i=0;i<graph[root].size();++i){
if(visit[graph[root][i].nextp]==1)
continue;
int tempmax=dis(graph,res,graph[root][i].nextp,visit)+graph[root][i].value;
if(tempmax>tempmax1){
tempmax2=tempmax1;
tempmax1=tempmax;
}
else if(tempmax>tempmax2)
tempmax2=tempmax;
}
res=max(res,tempmax1+tempmax2);
return max(tempmax1,tempmax2);
}
int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) {
// write code here
map<int,vector<edge>> graph; //邻接表
map<int,int> roots;
map<int,int> visits;
for(int i=0;i<Tree_edge.size();++i){
//统计顶点出现次数(仅出现一次的就是入度为0的顶点)
++roots[Tree_edge[i].start];
++roots[Tree_edge[i].end];
//建立无向图
graph[Tree_edge[i].start].push_back({Tree_edge[i].end,Edge_value[i]});
graph[Tree_edge[i].end].push_back({Tree_edge[i].start,Edge_value[i]});
visits[Tree_edge[i].start]=0;
visits[Tree_edge[i].end]=0;
}
int root=0;
//找一个根
for(auto i:roots)
if(i.second==1){
root=i.first;
break;
}
int res=0;
dis(graph,res,root,visits);
return res;
}
};

