Given n
nodes labeled from 0
to n - 1
and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.
For example:
Given n = 5
and edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
, return true
.
Given n = 5
and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
, return false
.
Note: you can assume that no duplicate edges will appear in edges
. Since all edges are undirected, [0, 1]
is the same as [1, 0]
and thus will not appear together in edges
.
union-find问题的变种,思路和解决union-find的问题几乎是完全一样的,由于树的定义要求图不能出现环路,因此当find出现相同的根时说明出现回路,返回false,另外一棵树只能有一个根,因此可以设置一个计数器判断最后所剩的根即树的个数是否为1:
private int count; private int[] res; public boolean validTree(int n, int[][] edges) { res=new int[n]; for(int i=0;i<n;i++) res[i]=i; count=n; for(int i=0;i<edges.length;i++){ int left=find(res,edges[i][0]); int right=find(res,edges[i][1]); if(left==right) return false; res[left]=right; count--; } return count==1; } public int find(int[]res,int i){ while(res[i]!=i) i=res[i]; return i; }