您的位置:首页 > 其它

Minimum Height Trees

2015-11-29 20:02 369 查看
题目:

https://leetcode.com/problems/minimum-height-trees/

思路:

所求结点为最长路径上的中间结点, 每次删除所有的叶子结点,多次删除后,最后剩下的就是中间结点

注:和求无向图的最长路径相似,还有另外一种解法

class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
vector<int> *matrix=new vector<int>
; // 邻接表
int *degree=new int
;
memset(degree,0,sizeof(int)*n);
for(unsigned int i=0;i<edges.size();++i){// 构建邻接表
int x=edges[i].first;
int y=edges[i].second;
matrix[x].push_back(y);
matrix[y].push_back(x);
degree[x]++;// 记录每个结点的度
degree[y]++;
}
vector<int> leaf;
for(int i=0;i<n;++i){//将叶子结点保存
if(degree[i]<=1){
leaf.push_back(i);
}
}
int leafCutCount=0;
while(leafCutCount<n-2){// 多轮删除叶子结点 & 根结点可能有一个或两个
vector<int> tem;
for(unsigned int i=0;i<leaf.size();++i){
int leafNo=leaf[i];
degree[leafNo]--;//删除叶子
leafCutCount++;
for(unsigned int j=0;j<matrix[leafNo].size();++j){
degree[matrix[leafNo][j]]--;
if(degree[ matrix[leafNo][j] ]==1){// 保存新叶子
tem.push_back(matrix[leafNo][j]);
}
}
}
leaf=tem;
}
delete[] matrix;
delete[] degree;
return leaf;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: