图的广度VS深度

深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:

  1. 把根节点压入栈中。
  2. 每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。
    并把这个元素记为它下一级元素的前驱。
  3. 找到所要找的元素时结束程序。
  4. 如果遍历整个树还没有找到,结束程序。

广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:

  1. 把根节点放到队列的末尾。
  2. 每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。
    并把这个元素记为它下一级元素的前驱
  3. 找到所要找的元素时结束程序。
  4. 如果遍历整个树还没有找到,结束程序。
关于深度优先: 广度优先分析以及代码展示

以下图为例:

该图的深度优先遍历结果应该为:1->2->4->8->5->3->6->7
该图的广度优先遍历结果应该为:1->2->3->4->5->6->7->8

center

广度优先代码展示:
	    //广度优先遍历
	public void bfs() {
	    for (int i = 0; i < getNum(); i++) {
	        if (!isVisited[i]) bfs(isVisited, i);
	    }
	}
	
	private void bfs(boolean[] isVisited, int i) {
	    int u;//表示队列头对应下标
	    int w;//邻接节点
	    LinkedList<Integer> list = new LinkedList<Integer>();
	    System.out.println(getValueByIndex(i));
	    list.addLast(i);
	    isVisited[i] = true;
	    while (!list.isEmpty()) {
	        u = list.removeFirst();
	        w = getFirstNode(u);
	        while (w != -1) {
	            if (!isVisited[w]) {
	                list.addLast(w);
	                isVisited[w] = true;
	                System.out.println(getValueByIndex(w));
	            }
	            w = getNextNode(u, w);
	        }
	    }
	}
深度优先代码展示:

深度优先代码

代码运行结果展示:

深度优先:
在这里插入图片描述
广度优先遍历:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章