图的遍历,深度优先,广度优先

37 阅读1分钟

图广度优先搜索和深度优先搜索

class Graph{
    private Map<Integer, List<Integer>> adjList;
    public Graph(){
        adjList=new HashMap<>();
    }
    public void addEdge(int src,int dest){
        adjList.putIfAbsent(src,new ArrayList<>());
        adjList.get(src).add(dest);
        adjList.putIfAbsent(dest,new ArrayList<>());
        adjList.get(dest).add(src);
    }
    // 广度优先搜索
    public void bfs(int startNode){
        Queue<Integer> queue=new LinkedList<>();
        Set<Integer> visited=new HashSet<>();
        visited.add(startNode);
        queue.add(startNode);
        while(!queue.isEmpty()){
            int currentNode=queue.poll();
            System.out.println(currentNode+" ");
            for (int neighbor:
                 adjList.getOrDefault(currentNode,Collections.emptyList())) {
                if(!visited.contains(neighbor)){
                    visited.add(neighbor);
                    queue.add(neighbor);
                }
            }
        }
    }
    //深度优先搜索
    public void dfs(int startNode){
        boolean[] visited=new boolean[adjList.size()];
        dfsUtil(startNode,visited);
    }
    private void dfsUtil(int vertex,boolean[] visited){
        visited[vertex]=true;
        System.out.println(vertex+" ");
        List<Integer> neighbor = adjList.get(vertex);
        for (int neibor:
             neighbor) {
            if(!visited[neibor]){
                dfsUtil(neibor,visited);
            }
        }
    }
}