Note:

1. Need check whether the node is the last node or not.

2. Need add a counter for counting how many branches it has.

class Solution {
    public boolean validTree(int n, int[][] edges) {
        if (n < 2) {
            return true;
        }
        Map<Integer, Set<Integer>> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            map.put(i, new HashSet<>());
        }
        
        for (int[] edge : edges) {
            map.get(edge[0]).add(edge[1]);
            map.get(edge[1]).add(edge[0]);
        }
        Queue<Integer> queue = new LinkedList<>();
        for (int v : map.keySet()) {
            if (map.get(v).size() == 1) {
                queue.offer(v);
            }
        }
        List<Integer> leaves = new ArrayList<>();
        int branch = 0;
        while (!queue.isEmpty()) {
            int current = queue.poll();
            if (map.get(current).size() > 0) {
                int child = map.get(current).iterator().next();
                map.get(child).remove(current);
                if (map.get(child).size() == 1) {
                    queue.offer(child);
                }
            } else {
                branch++;
            }
            map.remove(current);
            leaves.add(current);
        }
        return branch == 1 && leaves.size() == n;
    }
}

 

 

UnionFind

class Solution {
    public boolean validTree(int n, int[][] edges) {
        if (n < 2) {
            return true;
        }
        
        int[] parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
        
        for (int[] edge: edges) {
            int indexA = findParent(parent, edge[0]);
            int indexB = findParent(parent, edge[1]);
            
            if (indexA == indexB) {
                return false;
            }
            
            if (indexA < indexB) {
                parent[indexB] = indexA;
            } else {
                parent[indexA] = indexB;
            }
        }
        int root = 0;
        for (int i = 0; i < n; i++) {
            if (parent[i] == i) {
                root++;
            }
        }
        return root == 1;
    }
    
    private int findParent(int[] parent, int value) {
        while (parent[value] != value) {
            parent[value] = parent[parent[value]];
            value = parent[value];
        }
        return value;
    }
}

 

posted on 2017-09-07 14:49  keepshuatishuati  阅读(117)  评论(0编辑  收藏  举报