dfs实现
1.思路:从图中的未访问的一个顶点开始,沿着一条路一直走到底,然后
这条路尽头的节点,在从另外一条路走到底,不断递归此过程,直到所有
遍历完成
特点:不撞南墙不回头
2.具体实现:当从一个未知的顶点出发,将这条路走完时,会返回到上
一个节点,看他是否还有其他的子节点,如果有就继续往下遍历,如果没有就继续返回到
上一个节点,继续寻找除本身外还有其他节点不,以此类推
前序遍历:中左右
中序遍历:左中右
后序遍历:左右中
3.递归实现dfs
public class solution{
private static class Node{
public int value;//定义节点
public Node left;//定义左节点
public Node right;//定义右节点
//有参构造用来干什么的呢?
public Node(int value,Node left,Node right){
this.value = value;
this.left = left;
this.right = right;}
}
//dfs方法用来实现递归遍历所有节点
public static void dfs(Node treeNode){
if(treeNode ==null){return;}
process(treeNode);//为什么通过process方法遍历节点
dfs(treeNode.left);//为什么通过dfs来遍历左右节点?
dfs(treeNode.right);}
}
学了一遍基础,但是不扎实,很多东西不明白他的具体含义就过了
但这就是个过程,明白自己的不足,继续深深地学习
递归总结:递归中,节点类中定义了节点,左节点以及右节点,还有
有参构造,但忘记了有参构造的作用?
有参构造的作用用于属性初始化
如果子类继承父类时,子类中没有无参构造会报错
在在定义的静态dfs方法中,调用了process和dfs方法利用递归的思想
实现了dfs算法
4.非递归实现dfs算法
public void solution{
public static void dfswithstack(Node root){
if(root ==null){retuen;}
Stack<Node>stack = new Stack<>();
stack.push(root)//将根节点压入栈中;
while(!stack.isEmpty()){
Node treeNode = stack.pop();
process(treeNode);//遍历节点
if(treeNode.right!=null){stack.push(treeNode.right);}
if(treeNode.left!=null){stack.push(treeNode.left);}
}
}
}
总结:非递归方法实现dfs利用栈的先进后出的特点实现
①先创建一个有参函数来实现dfs算法的实现
②判断根节点是否为空,如果为空结束
③定义一个节点类型的栈对象,先将根节点压入栈中
④判断栈中的元素是否为空,如果不为空,
定义一个节点对象来表示栈的出栈
⑤之后通过process方法来遍历出栈元素
⑥在依次通过栈先进后出的思想通过先序遍历先将右节点进栈,
再将左节点进栈。后面再通过上面的treeNode对象将元素出栈,
并通过process方法遍历
注意:进栈的顺序以及各个节点进栈出栈的代码顺序
5..生产中泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫
dfs实现的更多相关文章
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)
来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS Memory Limit: 65536 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-1146】网络管理Network DFS序 + 带修主席树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
随机推荐
- uni-app微信小程序文本框计数功能
<view> <textarea placeholder="请输入" @input="sumfontnum" :maxlength=" ...
- Selenium 自动化中实现双击操作
在selenium中,以name定位为例,单击元素的代码为:driver.find_element_by_name("name").click(),那么,实现双击操作的代码能不能写 ...
- 理解 Shell
理解 Shell shell 的父子关系 用于登录的某个虚拟控制器终端,或在 GUI 中运行终端仿真器时所启动的默认的交互 shell,是一个父 shell.本书到目前为止都是父 shell 提供 C ...
- yugong诠释
整个迁移方案,分为两部分: 全量迁移 增量迁移 过程描述: 增量数据收集 (创建oracle表的增量物化视图) 进行全量复制 进行增量复制 (并行进行数据校验) 原库停写,切到新库 回滚方案: 开启新 ...
- 国际化vue-i18n 向语言包中传入参数
模板 <span>{{$t('el.table.total', { pagetotal: 123 })}}</span> js代码中 this.$t('el.table.num ...
- 字节过滤流 --->对象流(存入对象的)----> ObjectOutputStream: 用法
前提:1).要有一个类 并创建这个类的对象2)要让类必须继承Serializable接口3)transient修饰的属性 值不参与序列化1创建字节输出节点流FileOutputStream fos = ...
- 洛谷 P1832 A+B Problem(再升级)题解
START: 2021-08-09 15:28:07 题目链接: https://www.luogu.com.cn/problem/P1832 给定一个正整数n,求将其分解成若干个素数之和的方案总数. ...
- 基于airtest验证Android端app是否安装及自动化安装
1.检测app是否安装: 使用check_app方法检测是否安装:为什么需要在封装一层做断言呢?主要check_app方法安装成功会返回True,但是未检测到安装时直接报异常了,停止执行.无法直接 ...
- js计算某一天是本月的第几周
需要实现一个小需求,计算2月24号是2月的第几周: 废话不多说,直接上代码: /** * a = d = 当前日期 * b = 6 - w = 当前周的还有几天过完(不算今天) * a + b 的和在 ...
- django_设计模式和模板层
一.django的设计模式 1.传统MVC设计模式 (1)MVC(Model-View-Controller,模型-视图-控制器)模式. M--模型层,主要用于对数据库的封装: V--视图层,用于向用 ...