深度遍历与广度遍历

本盘文章是参考其他人的博客写的,只为自己记忆,参考者勿喷。

深度遍历:非递归,使用List保存已经访问过的节点

广度遍历:递归方式,List保存已经访问过的节点,使用Queue队列

具体图如下所示:

package com.cust.grape;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Set;

/**
 *
 * 描述:图的深度遍历和广度遍历
 * 深度遍历:
 *
 * 广度遍历:
 *
 * @author cookie
 */
public class DeptSearch {
	public static void main(String[] args) {
		Node a = new Node(1);
		Node b = new Node(2);
		Node c = new Node(3);
		Node d = new Node(4);
		Node e = new Node(5);
		Node f = new Node(6);
		Node g = new Node(7);
		Node h = new Node(8);
		Node k = new Node(9);
		Arc ab = new Arc(a, b);
		Arc ac = new Arc(a, c);
		Arc ad = new Arc(a, d);
		Arc be = new Arc(b,e);
		Arc bf = new Arc(b,f);
		Arc cg = new Arc(c,g);
		Arc ch = new Arc(c,h);
		Arc ek = new Arc(e,k);
		a.aList.add(ab);
		a.aList.add(ac);
		a.aList.add(ad);
		b.aList.add(be);
		b.aList.add(bf);
		c.aList.add(cg);
		c.aList.add(ch);
		e.aList.add(ek);
		System.out.print("广度遍历:");
		widthSort(a);
		System.out.println();
		System.out.print("深度遍历:");
		List<Node> visited = new ArrayList<Node>();
		deptSort(a,visited);
	}
	/**深度遍历:递归向下*/
	public static void deptSort(Node a,List<Node> visited){
		if(visited.contains(a)){//访问过,直接返回
			return;
		}else{
			visited.add(a);
			System.out.print(a.val+" ");
			for (int i = 0; i < a.aList.size(); i++) {
				deptSort(a.aList.get(i).end,visited);
			}
		}

	}
	/**广度遍历:非递归*/
	public static void widthSort(Node start){
		Set<Node> visited = new HashSet<Node>();
		Queue<Node> queue =new LinkedList<Node>();
		queue.offer(start);//首元素进栈
		while(!queue.isEmpty()){//栈不为空时
			Node n = queue.poll();
			if(!visited.contains(n)){//没有访问过,继续;访问过的元素跳过,继续下一个
				System.out.print(n.val+" ");
				visited.add(n);
				for (int i = 0; i < n.aList.size(); i++) {//被弹出元素的下一行元素,并非所有的下一行元素
					queue.offer(n.aList.get(i).end);//节点关系的end节点
				}
			}
		}
	}

}

/**
 *
 * 描述:节点
 * @author cookie
 */
class Node{
	public List<Arc> aList = new ArrayList<Arc>();
	public Integer val;//节点值
	public Node(Integer val) {
		this.val = val;
	}
}
/**
 *
 * 描述:节点之间的关系
 * @author cookie
 */
class Arc{
	public Node start;
	public Node end;
	public Arc(Node start, Node end) {
		this.start = start;
		this.end = end;
	}
}

  结果如下:

  广度遍历:1 2 3 4 5 6 7 8 9
  深度遍历:1 2 5 9 6 3 7 8 4

时间: 2024-11-05 21:59:12

深度遍历与广度遍历的相关文章

Java 实现深度遍历和广度遍历数及其应用

一.深度遍历和广度遍历原理及实现 1.深度优先 英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节点的的左侧). 深度优先遍历各个节点,需要使用到堆(Stack)这种数据结构.stack的特点是是先进后出.整个遍历过程如下: 首先将A节点压入堆中,stack(A); 将A节点弹出,同时将A的子节点C,B压入堆中,此

图的深度遍历和广度遍历

概述 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的其它算法如求解图的连通性问题,拓扑排序,求关键路径等都是建立在遍历算法的基础之上. 由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点.② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以

第五章 图的遍历(深度遍历,广度遍历,城市地图,最少转机)

深度和广度优先搜索: 单词分解:首先是搜索 深度和广度:是针对图的遍历而言的 图:由顶点和边组成 图的遍历:把图中每一个顶点都访问一次 一: 输入: 5 5(顶点数,边数) 1 2 1 3 1 5 2 4 3 5 输出: 1 2 4 3 5 (按时间戳输出)深度遍历 1 2 3 5 4 (按时间戳输出)广度遍历 1 #include <stdio.h> 2 int map[10][10], book[10], n, m,sum; 3 void dfs(int cur) 4 { 5 int i;

数据结构-深度遍历和广度遍历(转)

本文转自http://blog.csdn.net/wingofeagle/article/details/13020373 深度遍历: 从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到. 其更适合:目标比较明确,以找到目标为主要目的的情况. 广度遍历: 类似于树中的层序遍历,首先遍历完和某一顶点v相连的所有顶点,然后再遍历和这些顶点相连的顶点,以此类推. 其更适合于:不断扩大遍历范围时找到相对最优解的情况. 具体代码如下:

二叉树的前中后序遍历迭代&amp;广度遍历

递归很是简单 但也应该掌握其迭代方式的遍历方法 这三种的迭代遍历方法需要通过栈来存储节点 尤其是后序遍历还需要 记录当前节点的右子树是否已被遍历 决定是否遍历当前节点 而其广度遍历 只需要一个队列来顺序记录遍历节点 即可轻松解决问题  主要思想在程序代码中来做说明 前序遍历:遍历结果返回一个vector容器中 std::vector<int> BinaryTree::pre_order_iter(Binary_node *root){    std::vector<int> res

二叉树深度遍历和广度遍历

https://blog.csdn.net/weixin_39912556/article/details/82852749 package Method; import java.util.ArrayDeque; import java.util.Deque; import java.util.Queue; import java.util.Stack; /** * Created by joyce on 2019/9/11. */ public class TreeMain { privat

多级树的深度优先遍历与广度优先遍历(Java实现)

目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍历直接套用图结构的遍历方法即可. 工程中后端通常会用多级树来存储页面表单的各级联动类目,本文提供了深度遍历与广度遍历的示例,在使用时只要根据你的业务需求稍加改动即可. 我们知道,遍历有递归,非递归两种方式.在工程项目上,一般是禁用递归方式的,因为递归非

图的广度遍历和深度遍历

/* 图的遍历方法主要有两种:一种是深度优先遍历,一种是广度优先遍历.图的深度优先遍历类同于树的先根遍历,图的广度遍历类同树的层次遍历 一:连通图的深度优先遍历算法 图的深度优先遍历算法是遍历时深度优先的算法,即在图的所有邻接顶点中,每次都在访问当前顶点后,首先访问当前顶点的第一个邻接顶点. 连通图的深度优先遍历递归算法如下: 1.访问顶点v并标记顶点v已访问. 2.查找顶点v的第一个邻接顶点w. 3.若顶点v的邻接顶点w存在,则继续执行,否则算法结束. 4.若顶点w尚未被访问,则深度优先遍历递

深度、广度遍历

深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止. 如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止. 如右图所示的二叉树: A 是第一个访问的,然后顺序是 B.D,然后是 E.接着再是 C.F.G. 那么,怎么样才能来保证这个访问的顺序