package com.interview.graph; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 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. * https://leetcode.com/problems/graph-valid-tree/ */ public class ValidTree { public boolean validTree(int n, int[][] edges) { if (n <= 1) { return true; } Map<Integer, List<Integer>> graph = new HashMap<>(); for (int[] edge : edges) { List<Integer> neighbors = graph.get(edge[0]); if (neighbors == null) { neighbors = new ArrayList<>(); graph.put(edge[0], neighbors); } neighbors.add(edge[1]); neighbors = graph.get(edge[1]); if (neighbors == null) { neighbors = new ArrayList<>(); graph.put(edge[1], neighbors); } neighbors.add(edge[0]); } boolean[] visited = new boolean[n]; boolean hasCycle = isCycle(0, graph, -1, visited); if (hasCycle) { return false; } for (int i = 0; i < visited.length; i++) { if (!visited[i]) { return false; } } return true; } boolean isCycle(int vertex, Map<Integer, List<Integer>> graph, int parent, boolean[] visited) { if (visited[vertex]) { return true; } visited[vertex] = true; if (graph.get(vertex) == null) { return false; } for (int i : graph.get(vertex)) { if (i == parent) { continue; } if (isCycle(i, graph, vertex, visited)) { return true; } } return false; } }