图是否是树
题目
给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树
注意事项
你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。样例
给出n = 5 并且 edges = [[0, 1], [0, 2], [0, 3], [1, 4]], 返回 true.
给出n = 5 并且 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], 返回 false.题解
遍历图,看是否存在环,存在环则不是树。是否存在孤立节点,如果有则不是树。
public class Solution {
class UnionFind
{
HashMap<Integer, Integer> father = new HashMap<Integer, Integer>();
UnionFind(int n)
{
for(int i = 0 ; i < n; i++)
{
father.put(i, i);
}
}
int compressed_find(int x)
{
int parent = father.get(x);
while(parent!=father.get(parent))
{
parent = father.get(parent);
}
int temp = -1;
int fa = father.get(x);
while(fa!=father.get(fa))
{
temp = father.get(fa);
father.put(fa, parent) ;
fa = temp;
}
return parent;
}
void union(int x, int y)
{
int fa_x = compressed_find(x);
int fa_y = compressed_find(y);
if(fa_x != fa_y)
father.put(fa_x, fa_y);
}
}
/**
* @param n an integer
* @param edges a list of undirected edges
* @return true if it's a valid tree, or false
*/
public boolean validTree(int n, int[][] edges) {
if (n - 1 != edges.length)
{
return false;
}
UnionFind uf = new UnionFind(n);
for (int i = 0; i < edges.length; i++)
{
if (uf.compressed_find(edges[i][0]) == uf.compressed_find(edges[i][1]))
{
return false;
}
uf.union(edges[i][0], edges[i][1]);
}
return true;
}
}
Last Update 2016.10.25