Graph Valid Tree
Givennnodes labeled from0ton-1and 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.
Example 1:
Input:
n = 5
, and 
edges = [[0,1], [0,2], [0,3], [1,4]]
Output:
 trueExample 2:
Input:
n = 5, 
and 
edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
Output:
 falseNote: you can assume that no duplicate edges will appear inedges. Since all edges are undirected,[0,1]is the same as[1,0]and thus will not appear together inedges.
分析
DFS
建图 graph = {i:[] for i in range(n)},无方向所以双向
从node 0起for loop,no cycle(dfs) and len(seen) ==n
seen这里做visited,不需要弹出因为树不回头
注意all用法。要排除grandparent!=neighbor是因为双向图,排除2个点互指的情况。
class Solution:
    def validTree(self, n: int, edges: List[List[int]]) -> bool:        
        seen = set()
        graph = {i:[] for i in range(n)}
        for e in edges:#undirected
            graph[e[0]].append(e[1])
            graph[e[1]].append(e[0])
        return self.dfs(graph,seen,0,-1) and len(seen) == n
    def dfs(self, graph, seen,node,parent):
        if node in seen:
            return False
        seen.add(node)
        return all([self.dfs(graph,seen,n,node) for n in graph[node] if n!=parent]) #child!=grandparentbfs
start from any node and delete every node we meet during the BFS. If there is any node left, then there is an isolated component.
注意dict pop用法,no isolated component =no cycle.
class Solution:
    def validTree(self, n: int, edges: List[List[int]]) -> bool:        
        if len(edges) != n-1: return False #别忘了这个!!!!!!!!
        g,q = {i:[] for i in range(n)},[0]
        for a,b in edges:#undirected
            g[a].append(b)
            g[b].append(a)
        for i in q:
            q+=g.pop(i,[])
        return not gUnion find
union two nodes that are already in the same group, then there is a cycle.
class Solution:
    def validTree(self, n: int, edges: List[List[int]]) -> bool:        
        if len(edges) != n-1: return False #别忘了这个
        f = list(range(n))
        def find(x):
            if f[x]!=x:
                f[x] = find(f[x])
            return f[x]   
        for a,b in edges:
            fa,fb = find(a),find(b)
            if fa==fb:
                return False
            f[fa] = fb
        return TrueLast updated
Was this helpful?