You have a graph of n nodes, numbered from 0 to n - 1, and a list edges where edges[i] = [ai, bi] means that there is an undirected edge between nodes ai and bi.
The graph is a tree when it is connected (you can get from any node to any other by following edges) and has no cycle (no path of edges leads from a node back to itself without using an edge twice). Put another way, there is exactly one path between any two nodes.
Return True if the edges make the graph a valid tree, or False otherwise.
Example 1:
Input: n = 5, edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
Output: True
Explanation: Every node can be reached from node 0, and no edge closes a cycle:
0
/ | \
1 2 3
|
4
Example 2:
Input: n = 5, edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]] Output: False Explanation: The edges 1 - 2, 2 - 3 and 1 - 3 form a cycle, so there are two paths from 1 to 3.
Example 3:
Input: n = 4, edges = [[0, 1], [1, 2], [2, 0]] Output: False Explanation: There are 3 edges for 4 nodes, the number a tree of 4 nodes has, but the edges 0 - 1, 1 - 2 and 2 - 0 form a cycle, and node 3 has no edge at all. Counting the edges is not enough.
Constraints:
1 <= n <= 1050 <= edges.length <= 105edges[i].length == 20 <= ai, bi < nai != bi- There are no repeated edges.
Note:
Your algorithm should run in O((n + e)·α(n)) time, nearly O(n + e), where e is the number of edges, and use O(n) extra space.
A tree with n nodes has exactly n - 1 edges. With that many edges, the graph is a tree exactly when no edge closes a cycle, because then every edge joins two separate groups and the n single nodes end up as one group. The tutorial checks the count first, then adds the edges one by one with union-find, as in Number of Connected Components in an Undirected Graph: an edge whose two nodes are already in the same group closes a cycle. With path halving and union by size, each step costs O(α(n)) on average, where α is the inverse Ackermann function, below 5 for any n a computer can hold.
A DFS or BFS from node 0 that checks that every node is reached also works in O(n + e) once the count is right; on a graph this big, use a BFS or a DFS with its own stack, since a recursive DFS down a path of 105 nodes can run out of call stack.
Free plan: 30 tutor messages. Premium is unlimited.
