图的遍历

来源:互联网 发布:尼泊尔少年 知乎 编辑:程序博客网 时间:2024/06/16 19:42

DFS深度优先遍历:

1 .将顶点元素取出,标记该节点已经被访问过,放入栈中

2 .从栈中将顶点元素peek出来,查找他的没有被访问过的邻居节点,如果不存在,则将该顶点从栈中pop出来,如果存在邻居节点则将其标记为访问过,输出,入栈

3 .循环步骤2直至 栈为空

BFS广度优先遍历:

1.取出根节点,放入队列中,标记该节点已被访问过true

2.将队列中的根节点poll出来,访问他的所有相邻的节点,将他们的访问标记置为false,并将它们一一入栈

3.循环步骤直至队列为空

package GraphNew;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class SearchGraph {    //顶点数组    public Vertex[] vertexlist;    //二维邻接矩阵    public int[][] adj;    //顶点个数    public int nvertext;    public SearchGraph(int N){        vertexlist = new Vertex[N];        adj = new int[N][N];        nvertext = 0;    }    //添加顶点    public void addVertex(int key){        vertexlist[nvertext++] = new Vertex(key);    }    //添加边    public void addEdge(int start , int end){        adj[start][end] = 1;        adj[end][start] = 1;    }    public int findadjunused(int v){        for(int i=0; i<nvertext;i++)        {            if(adj[i][v] == 1 && vertexlist[i].visted==false)                return i;        }        return -1;    }    //图的深度优先遍历    public void dfs()    {        //首先访问零号节点  将访问标记置为true        vertexlist[0].visted=true;        //输出该顶点        System.out.println(vertexlist[0].data);        //将该顶点压入栈中        Stack<Integer> stack = new Stack<Integer>();        stack.push(vertexlist[0].data);        //判断栈是否为空        while(!stack.isEmpty())        {            //将栈中元素取出            //遍历邻接矩阵 获取它的相邻且未被访问过的节点            int node = findadjunused(stack.peek());            //如果没有可以访问的节点,则将此节点pop            if(node==-1)            {                stack.pop();            }            else             {                //如果有的话,则将其标记为已经访问过                vertexlist[node].visted = true;                stack.push(node);                System.out.println(node);            }        }    }    //图的广度优先遍历    public void bfs(){        //首先访问零号节点  将访问标记置为true        vertexlist[0].visted=true;        System.out.println(vertexlist[0].data);        //将该顶点放入队列中        Queue<Integer> queue = new LinkedList<Integer>();        queue.add(vertexlist[0].data);        while(!queue.isEmpty())        {            int root = queue.poll();            for(int i=0; i<nvertext; i++)            {                if(adj[root][i]==1 && vertexlist[i].visted==false)                {                    vertexlist[i].visted = true;                    System.out.println(vertexlist[i].data);                    queue.add(i);                }            }        }    }    public static void main(String args[]){        SearchGraph g=new SearchGraph(10);        for(int i=0;i<10;i++)        {            g.addVertex(i);        }        g.addEdge(0, 1);        g.addEdge(0, 4);        g.addEdge(1, 4);        g.addEdge(1, 3);        g.addEdge(1, 2);        g.addEdge(3, 4);        g.addEdge(3, 2);        g.addEdge(3, 5);        g.addEdge(3, 2);        g.addEdge(2, 6);        g.addEdge(4, 7);        g.addEdge(5, 8);        g.addEdge(3, 6);        g.addEdge(6, 9);        System.out.println("深度优先遍历");        g.dfs();        System.out.println("广度优先遍历");        g.bfs();    }}/* * 顶点类 * 包含标记访问符号 */class Vertex{    int data;    public boolean visted;    public Vertex(int data) {        super();        this.data = data;    }}
0 0
原创粉丝点击