java DFS与BFS算法
深度优先遍历(DFS)
DFS算法,一种用于遍历树或图的算法,它会沿着树的深度遍历树的节点,当访问到不满足条件的时候,就会进行回溯,然后重复执行该操作,直到所有节点都被遍历完;
该图取自于malanlllll
下列是对二叉搜索树(BSTree)的探究
//节点类型
class Node {Node left;Node right;Object data;private boolean visited = false;public void add(Node p) {if ((int) p.data < (int) this.data) {if (this.left == null) {this.left = p;} elsethis.left.add(p);} else {if (this.right == null)this.right = p;elsethis.right.add(p);}}public Node() {}public Node(Object p) {data = p;left=null;right=null;}}
//树类型
class Tree{private Node root;public void add(Object p){if(root==null){root=new Node(p);}else{root.add(new Node(p));}}
}
首先理解的是:如何沿着树的节点进行深度遍历;
- 树的节点本质上是一个地址
- 每一个节点都有它的子节点(也就是存放了子节点的地址)
- 将当前节点指向子节点就会进行深度遍历
这里用递归的方法实现DFS(代码短)
public void dfssearch(){if(root==null)//当root为空 就没必要对树进行遍历return;else{DfsSearch(root);}}private void DfsSearch(Node node) {//node存放当前的节点if (node.left != null)//先对左节点进行深度遍历DfsSearch(node.left);//直到左节点为Null//就会输出当前节点的值System.out.println(node.data);//输出后就对右节点进行深度遍历if (node.right != null)DfsSearch(node.right);//最后回溯返回到父节点}
广度优先算法(BFS)
BFS算法,它会对树或图进行"逐层"的遍历,也就是层序遍历,相较于DFS算法而言,BFS它不会直接到末尾,而是到下一层之前,会将节点的所有兄弟节点遍历完之后,再进入下一层。
从这一个定义,不难发现进行BFS需要一个FIFO(先进先出)的数组,也就是队列,而在JAVA中LinkedList就符合这样的情况
public void bfsSearch(){if(root==null)return;else{BfsSearch();}}private void BfsSearch(){LinkedList queue=new LinkedList();queue.add(root);//将根节点存放进队列中while(!queue.isEmpty()){//只要队列不为空,也就是说没有对树遍历完成Node cur=(Node) queue.removeFirst();//将队列移除的节点作为当前节点System.out.println(cur.data);//将子节点存放进队列if(cur.left!=null)queue.add(cur.left);if(cur.right!=null)queue.add(cur.right);}
//主函数测试
public static void main(String[] args) {Tree root=new Tree();root.add(5);root.add(3);root.add(9);root.add(4);root.add(2);root.add(8);root.add(7);}
这就是该树的结构
DFS算法结果
BFS算法的结果
总结
BFS用于搜索单一的最短路径,特点就是"搜到就是最优的解"
DFS用于查找所有的解,空间效率高,但不一定是最优解
java DFS与BFS算法相关推荐
- [算法] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂
二叉树的DFS与BFS算法 (Java) 1.概念 ①DFS (深度优先搜索) 维基百科读一遍 定义看完, 看一遍gif ②BFS (广度优先搜索) 维基百科读一遍 gif看一遍 2. 算法实现 二叉 ...
- DFS和BFS算法介绍
我根据看别人的帖子总结的.这篇文章合适对深度优先遍历和广度优先遍历原理有一定了解的同志阅读,深度和广度这两个概念大家都知道的:图通过邻接表存储,深度就是有多少层,广度就是有多宽,两者原理上的区别是DF ...
- java迷宫队列实现_Creator 迷宫生成: DFS 与 BFS 算法实现
前言: 我的迷宫代码的实现受到 [liuyubobobo] 的影响. liuyubobobo 迷宫的实现: GUI 部分使用 java Swing,编程语言是 Java. **我的迷宫代码实现: ** ...
- [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析
- 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)
广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...
- 搜素算法(基础)--DFS/BFS算法(JAVA)
DFS.BFS的定义及C语言算法实现请参照 连通图遍历策略之深度优先搜索(C语言) 连通图遍历策略之广度优先搜索(C语言) 为了便于理解这里的数据是一个无向图,要求输出遍历顺序 下面只给出用例和算法, ...
- 【Java算法之dfs 与bfs详解】
下次再也不鸽了(つಥ㉨ಥ)つ 我发誓,真的!!! Java算法之dfs 与bfs 1. dfs 1.1 dfs递归 2. bfs 1. bfs常见两类问题 1.1==是否==有路径问题 1.2最短路径 ...
- 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)
文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...
- 图文详解 DFS 算法 和 BFS 算法
点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自 码海 前言 深度优先遍历(Depth First Search, 简称 DFS) ...
- 算法---DFS和BFS
一 : 什么是DFS和BFS? 转载自 : 什么是DFS和BFS? 简介: 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search ...
最新文章
- python示例异常处理与程序调试_笔记:Python异常处理与程序调试
- 什么是人工神经网络?
- Python day7之mysql
- 正态分布表怎么查表_《深入浅出统计学》-读书笔记-再谈正态分布的应用
- 数据-第9课-静态链表
- opencv 快速生成scv文件 java
- 样本T检验、方差分析(ANOVA)、wilcoxon秩和检验、KW秩和检验详解和操作步骤
- 关于H.265/HEVC视频压缩标准相较H.264/AVC节省50%左右的带宽方案的推荐
- 自同步扰乱编码器的原理与MATLAB仿真
- 台式计算机wifi老掉线,电脑连接WiFi容易断线或速度慢怎么回事 教你怎么解决
- 继美团重申严禁诱导强迫骑手注册成个体工商户后,饿了么也回应了
- Excel表格×××号码如何一键提取性别、年龄、出生年月
- 安卓10侧边返回_向返回键说拜拜,安卓10向全面屏手势继续迈进
- gentoo问题汇总
- Ipoe和Pppoe,宽带认证技术
- Python_np.sum()函数
- Tomcat中设计模式
- C++ 将当前系统时间转换成标准格式的时间和时间戳
- Studio 3T 破解教程
- 工程事故与现实世界(续)