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 ...
随机推荐
- 关闭Google自动更新
一.禁用任务计划 二.禁用更新服务 三.重命名更新程序 首先找到谷歌浏览器的安装位置
- PVE设置屏幕休眠和笔记本合盖不休眠
注意源文件中的命令前的#号要删除. 二.屏幕休眠
- 【基础知识】C++算法基础(快速排序)
快速排序: 1.执行流程(一趟快排): 2.一趟快排的结果:获得一个枢纽,在此左边皆小于此数,在此右边皆大于此数,因此可以继续使用递归获得最终的序列.
- [Leetcode 559]N叉树的最大深度Maximum Depth of N-ary Tree DFS/BFS模板
题目 https://leetcode.com/problems/maximum-depth-of-n-ary-tree/ N叉树的最大深度 Given a n-ary tree, find its ...
- 几个Python线程坑,和连接池的坑
urlretrieve 没有超时,需要通过socket来设置 socket.setdefaulttimeout(10) 而且还需要为他设置连接池,所以直接改用requests来下载文件 def dow ...
- 【vue】数据代理
Object.defineProperty()方法 我们先来看几段代码 常用添加属性的方法,以添加age举例 ,点击查看代码 let person = { name: '张三', sex: '男', ...
- tuxedo 12c 安装
tuxedo12c 安装命令 静默安装 控制台安装 tuxedo版本介绍 Tuxedo Release Name Tuxedo Release Number Note which contains L ...
- ssh反向代理树莓派+motion,实现公网远程视频监控
注意:本文公网远程监控部分需要借助有公网IP的云服务器进行ssh反向代理. 一.借助motion实现内网的视频监控 准备 插上摄像头,然后输入ls /dev/video*命令检查是否识别了摄像头 安装 ...
- nios verify failed 问题解决。
nios 调试时碰到上图所示问题.根据下载地址可以判断下载flash.sdram都成功,这里说明电路设计和焊接都没有问题. 但是在flash地址verify failed between adress ...
- uglifyjs-webpack-plugin配置
项目使用vuecli3搭建,在vue.config.js文件中进行配置,主要配置了去除线上环境的打印信息. 首先安装插件, 执行命令 npm install uglifyjs-webpack-plug ...