Java图形有效树详解

给定n个从0到n-1标记的节点和一系列无向边(每个边是一对节点),请检查这些边是否形成有效树。

分析

可以将这个问题转换为从图形中查找循环。可以通过使用DFS(递归)或BFS(队列)来解决。
Java解决方案1-DFS
public boolean validTree(int n, int[][] edges) {
HashMap<Integer, ArrayList> map = new HashMap<Integer, ArrayList>();
for(int i=0; i<n; i++){
ArrayList list = new ArrayList();
map.put(i, list);
}

for(int[] edge: edges){
    map.get(edge[0]).add(edge[1]);
    map.get(edge[1]).add(edge[0]);
}

boolean[] visited = new boolean[n];

if(!helper(0, -1, map, visited))
    return false;

for(boolean b: visited){
    if(!b)
        return false;
}

return true;}

public boolean helper(int curr, int parent,
HashMap<Integer, ArrayList> map, boolean[] visited){
if(visited[curr])
return false;

visited[curr] = true;

for(int i: map.get(curr)){
    if(i!=parent && !helper(i, curr, map, visited)){
        return false;
    }
}   

return true;}

Java解决方案2-BFS
public boolean validTree(int n, int[][] edges) {
ArrayList<ArrayList> list = new ArrayList<>();
for(int i=0; i<n; i++){
list.add(new ArrayList<>());
}

    //build the graph
    for(int[] edge: edges){
        int a = edge[0];
        int b = edge[1];

        list.get(a).add(b);
        list.get(b).add(a);
    }

    //use queue to traverse the graph
    HashSet<Integer> visited = new HashSet<>();
    LinkedList<Integer> q = new LinkedList<>();
    q.offer(0);

    while(!q.isEmpty()){
        int head = q.poll();

        if(visited.contains(head)){
            return false;
        }

        visited.add(head);

        ArrayList<Integer> vList = list.get(head);
        for(int v: vList){
            if(!visited.contains(v)){
                q.offer(v); 
            }     
        }
    }

    if(visited.size()<n){
        return false;
    }

    return true;
}

最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。在这里插入图片描述

发布了98 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhaozihao594/article/details/104278551
今日推荐