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

一、深度遍历和广度遍历原理及实现

1、深度优先

英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节点的的左侧)。

深度优先遍历各个节点,需要使用到堆(Stack)这种数据结构。stack的特点是是先进后出。整个遍历过程如下:

首先将A节点压入堆中,stack(A);

将A节点弹出,同时将A的子节点C,B压入堆中,此时B在堆的顶部,stack(B,C);

将B节点弹出,同时将B的子节点E,D压入堆中,此时D在堆的顶部,stack(D,E,C);

将D节点弹出,没有子节点压入,此时E在堆的顶部,stack(E,C);

将E节点弹出,同时将E的子节点I压入,stack(I,C);

...依次往下,最终遍历完成,Java代码大概如下:


public void depthFirst() {

Stack<Map<String, Object>> nodeStack = new Stack<Map<String, Object>>();

Map<String, Object> node = new HashMap<String, Object>();

nodeStack.add(node);

while (!nodeStack.isEmpty()) {

node = nodeStack.pop();

System.out.println(node);

//获得节点的子节点,对于二叉树就是获得节点的左子结点和右子节点

List<Map<String, Object>> children = getChildren(node);

if (children != null && !children.isEmpty()) {

for (Map child : children) {

nodeStack.push(child);

}

}

}

}

?//节点使用Map存放

2、广度优先

英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。对于上面的例子来说,广度优先遍历的 结果是:A,B,C,D,E,F,G,H,I(假设每层节点从左到右访问)。

广度优先遍历各个节点,需要使用到队列(Queue)这种数据结构,queue的特点是先进先出,其实也可以使用双端队列,区别就是双端队列首位都可以插入和弹出节点。整个遍历过程如下:

首先将A节点插入队列中,queue(A);

将A节点弹出,同时将A的子节点B,C插入队列中,此时B在队列首,C在队列尾部,queue(B,C);

将B节点弹出,同时将B的子节点D,E插入队列中,此时C在队列首,E在队列尾部,queue(C,D,E);

将C节点弹出,同时将C的子节点F,G,H插入队列中,此时D在队列首,H在队列尾部,queue(D,E,F,G,H);

将D节点弹出,D没有子节点,此时E在队列首,H在队列尾部,queue(E,F,G,H);

...依次往下,最终遍历完成,Java代码大概如下:


public void breadthFirst() {

Deque<Map<String, Object>> nodeDeque = new ArrayDeque<Map<String, Object>>();

Map<String, Object> node = new HashMap<String, Object>();

nodeDeque.add(node);

while (!nodeDeque.isEmpty()) {

node = nodeDeque.peekFirst();

System.out.println(node);

//获得节点的子节点,对于二叉树就是获得节点的左子结点和右子节点

List<Map<String, Object>> children = getChildren(node);

if (children != null && !children.isEmpty()) {

for (Map child : children) {

nodeDeque.add(child);

}

}

}

}

//这里使用的是双端队列,和使用queue是一样的

二、应用---用广度优先遍历树,并且记录满足某些要求的所有的路径

				
时间: 2024-10-05 08:07:34

Java 实现深度遍历和广度遍历数及其应用的相关文章

深度遍历与广度遍历

本盘文章是参考其他人的博客写的,只为自己记忆,参考者勿喷. 深度遍历:非递归,使用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.Que

图的深度遍历和广度遍历

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

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

深度和广度优先搜索: 单词分解:首先是搜索 深度和广度:是针对图的遍历而言的 图:由顶点和边组成 图的遍历:把图中每一个顶点都访问一次 一: 输入: 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尚未被访问,则深度优先遍历递

图的深度和广度遍历(邻接矩阵)

这里我采用邻接矩阵的存储方式对图进行遍历 #include <iostream> #include <queue> #define INFINITY 100 #define MAXNODE 100 #define OK 1 using namespace std; typedef char VertexType; int vis[MAXNODE]; typedef struct { int adj; } ArcType; typedef struct { VertexType ve