描述:
给出 n
个节点,标号分别从 0
到 n - 1
并且给出一个 无向
边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树
样例:
给出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.
思路:
树的两个特点(1)边的数量等于节点的数量-1 (2)每个节点都可以访问到
所以首先判断边数然后判断每个节点是否都可以访问的到。
public class Solution {
/**
* @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) {
// Write your code here
if(edges.length != n - 1){
return false;
}
int[][] temp = new int[n][n];
for(int i = 0;i<edges.length;i++){
int p = edges[i][0];
int q = edges[i][1];
temp[p][q] = 1;
temp[q][p] = 1;
}
boolean[] visit = new boolean[n];
for(int i = 0;i<n;i++){
visit[i] = false;
}
search(visit , temp , 0);
for(int j = 0;j<n;j++){
if(!visit[j]){
return false;
}
}
return true;
}
public void search(boolean[] visit , int[][] temp , int current){
visit[current] = true;
for(int i = 0;i<temp.length;i++){
if(temp[current][i] == 1 && visit[i] == false){
search(visit , temp , i);
}
}
}
}