解决思路

以这棵树为例,首先MHT的根节点不会是叶子节点,所以删除0,1,2,5
剩下的3,4就是MHT的根节点。
即一层一层的删掉叶子节点,直到只剩下一个或者两个节点。
提交代码
class Solution{
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if(n==1) return Collections.singletonList(0);
List<Set<Integer>> tree = new ArrayList<>(n);
for(int i =0;i<n;i++)
tree.add(new HashSet<>());
for(int[] edge:edges) {
tree.get(edge[0]).add(edge[1]);
tree.get(edge[1]).add(edge[0]);
}
int treeSize = n;
List<Integer> leaves = new ArrayList<>();
while(treeSize>2) {
leaves.clear();
for(int i=0;i<tree.size();i++)
if(tree.get(i).size()==1)
leaves.add(i);
treeSize -= leaves.size();
if(treeSize < 3) {
for(int i : leaves)
tree.get(i).clear();
break;
}
for(int i : leaves) {
tree.get(tree.get(i).iterator().next()).remove(i);
tree.get(i).clear();
}
}
List<Integer> res = new ArrayList<>();
for(int i=0;i<n;i++) {
if(tree.get(i).size()!=0)
res.add(i);
}
return res;
}
}
运行结果

本文介绍了一种算法,用于在给定的无向图中找到所有最小高度树(MHT)的根节点。通过逐步删除叶子节点直至剩下1或2个节点,最终确定MHT的根。该算法适用于信息技术领域的图论和数据结构研究。
1034

被折叠的 条评论
为什么被折叠?



