算法——图的深度优先遍历和广度优先遍历

20 篇文章 1 订阅
订阅专栏

更多参考:

深度优先遍历:深度优先遍历是图论中的经典算法。其利用了深度优先搜索算法可以产生目标图的相应拓扑排序表,采用拓扑排序表可以解决很多相关的图论问题,如最大路径问题等等。

根据深度优先遍历的特点我们利用Java集合类的栈Stack先进后出的特点来实现。我用二叉树来进行深度优先搜索。

深度优先搜索的步骤为:

(1)首先节点 1 进栈,节点1在栈顶;

(2)然后节点1出栈,访问节点1,节点1的孩子节点3进栈,节点2进栈;

(3)节点2在栈顶,然后节点2出栈,访问节点2

(4)节点2的孩子节点5进栈,节点4进栈

(5)节点4在栈顶,节点4出栈,访问节点4,

(6)节点4左右孩子为空,然后节点5在栈顶,节点5出栈,访问节点5;

(7)节点5左右孩子为空,然后节点3在站顶,节点3出栈,访问节点3;

(8)节点3的孩子节点7进栈,节点6进栈

(9)节点6在栈顶,节点6出栈,访问节点6;

(10)节点6的孩子为空,这个时候节点7在栈顶,节点7出栈,访问节点7

(11)节点7的左右孩子为空,此时栈为空,遍历结束。

广度优先遍历:广度优先遍历是连通图的一种遍历策略,因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域故得名。

根据广度优先遍历的特点我们利用Java数据结构队列Queue来实现。

广度优先搜索的步骤为:

(1)节点1进队,节点1出队,访问节点1

(2)节点1的孩子节点2进队,节点3进队。

(3)节点2出队,访问节点2,节点2的孩子节点4进队,节点5进队;

(4)节点3出队,访问节点3,节点3的孩子节点6进队,节点7进队;

(5)节点4出队,访问节点4,节点4没有孩子节点。

(6)节点5出队,访问节点5,节点5没有孩子节点。

(7)节点6出队,访问节点6,节点6没有孩子节点。

(8)节点7出队,访问节点7,节点7没有孩子节点,结束。

广度优先和深度优先遍历算法实现代码:

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
 
/**
 * 深度优先遍历
 * 
 *
 */
public class DeepFirstSort {
	public static void main(String[] args) {
		TreeNode head=new TreeNode(1);
		TreeNode second=new TreeNode(2);
		TreeNode three=new TreeNode(3);
		TreeNode four=new TreeNode(4);
		TreeNode five=new TreeNode(5);
		TreeNode six=new TreeNode(6);
		TreeNode seven=new TreeNode(7);
		head.rightNode=three;
		head.leftNode=second;
		second.rightNode=five;
		second.leftNode=four;
		three.rightNode=seven;
		three.leftNode=six;
		System.out.print("广度优先遍历结果:");
		new DeepFirstSort().BroadFirstSearch(head);
		System.out.println();
		System.out.print("深度优先遍历结果:");
		new DeepFirstSort().depthFirstSearch(head);
	}
	
	//广度优先遍历是使用队列实现的
	public void BroadFirstSearch(TreeNode nodeHead) {
		if(nodeHead==null) {
			return;
		}
		Queue<TreeNode> myQueue=new LinkedList<>();
		myQueue.add(nodeHead);
		while(!myQueue.isEmpty()) {
			TreeNode node=myQueue.poll();
			System.out.print(node.data+" ");
			if(null!=node.leftNode) {
				myQueue.add(node.leftNode);    //深度优先遍历,我们在这里采用每一行从左到右遍历
			}
			if(null!=node.rightNode) {
				myQueue.add(node.rightNode);
			}
			
		}
	}
	
	//深度优先遍历
	public void depthFirstSearch(TreeNode nodeHead) {
		if(nodeHead==null) {
			return;
		}
		Stack<TreeNode> myStack=new Stack<>();
		myStack.add(nodeHead);
		while(!myStack.isEmpty()) {
			TreeNode node=myStack.pop();    //弹出栈顶元素
			System.out.print(node.data+" ");
			if(node.rightNode!=null) {
				myStack.push(node.rightNode);    //深度优先遍历,先遍历左边,后遍历右边,栈先进后出
			}
			if(node.leftNode!=null) {
				myStack.push(node.leftNode);
			}
		}
		
	}
 
}

结果为:

深度优先遍历广度优先遍历算法
11-23
的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握这一数据结构的基础。通过此程序算法可以进一步掌握的构造以及遍历的相关知识。
前序/中序/后序遍历/哈夫曼树
SKY_yiyi_9的博客
09-18 4926
1.前序遍历首访问根结点然后遍历左子树,最后遍历子树。在遍历左、子树时,仍然访问根结点,然后遍历左子树,最后遍历子树。 中序遍历首遍历左子树,然后访问根结点,最后遍历子树。若二叉树为空则结束返回 后序遍历首遍历左子树,然后遍历子树,最后访问根结点,在遍历左、子树时,仍然遍历左子树,然后遍历子树,最后遍历根结点。 前序遍历:根左 中序遍历:左根 后序:左根 前序遍历结果:ABDECF 中序遍历结果:DBEAFC 后序遍历结果:DEBFCA 已知前序遍历和中序遍历,就能确定后序遍
数据结构学习笔记——的遍历算法(深度优搜索和广度优搜索)
小宇y的博客
08-18 1万+
若通过邻接表表示,则每个顶点都入队一次,即所需时间为O(|V|),搜索顶点的邻接顶点所需时间为O(|E|),其时间复杂度为O(|V|+|E|)。若通过邻接表表示,则查找所有顶点的邻接顶点所需时间为O(|E|),访问顶点所需时间为O(|V|),即总时间复杂度为O(|V|+|E|)。4、查看V7单链表,其邻接顶点为2,即V3,它已经被访问过,于是回到V3单链表,搜索下一个未被访问的邻接顶点;11、查看V8单链表,其邻接顶点为4,即V5,已经被访问过,于是回到V5单链表,搜索下一个未被访问的邻接顶点;....
数据结构 part2
qq_57682820的博客
05-02 527
文章目录的遍历深度优先遍历(DFS)遍历步骤邻接矩阵的存储邻接表的存储广度优先遍历(BFS)遍历步骤非连通的遍历连通分量如何遍历生成树 的遍历 深度优先遍历(DFS) 遍历步骤 ①在访问中某一起始顶点v后,由v出发,访问它的任一邻接顶点w; ②从w1出发,访问与w1邻接但还未被访问过的顶点w2;然后再从w2出发,进行类似的访问… ③如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止。 ④接着,退到前一次刚访问过的顶点,看是否还有其它未被访问的邻接顶点。 如果有,则访问此顶点,之后再从此顶点
深度优先遍历广度优先遍历
hellolde的博客
08-22 3343
的遍历: 从给定中指定的顶点出发,按照某种搜索方法沿着的边访问中的所有顶点,使得每个顶点只会被访问一次,这个过程叫做的遍历。的遍历方法有两种:深度优先遍历(DFS)和广度优先遍历(BFS)。 1.深度优先遍历 深度优先遍历类似于树的序遍历。一次深度优先遍历的基本过程可以用递归的方法来描述: (1)从起始点v出发,首访问顶点v。 (2)选择一个与顶点v相邻接且没有被访问过的顶点w作为新的起始点,继续深度优先遍历,直到顶点v的所有邻接点都被访问过。 例如,对于无向来说,如果无向是连通的,则一
深度优先遍历广度优先遍历的实现
weixin_42326997的博客
04-12 1万+
的定义和术语 (grath)由一个顶点(vertex)的有穷非空集合V(G)和一个弧(arc)的集合E(G)组成,通常记作G = (V,E)。中的顶点就是数据结构中的数据元素,弧的集合E实际上是定义在顶点集合上的一个关系。以下用有序对<v,w>,表示v到w的一条弧。弧有方向性,需以一带有箭头的线段表示,通常称v(没有箭头的出发端)为弧尾或始点称w(带有箭头的终止端)为弧头或终点,...
JavaScript树的深度优先遍历广度优先遍历算法示例
10-18
主要介绍了JavaScript树的深度优先遍历广度优先遍历算法,结合实例形式分析了JavaScript树的深度优先遍历广度优先遍历递归与非递归相关实现技巧,需要的朋友可以参考下
Graph1_非递归算法进行深度优先遍历广度优先遍历_
10-02
使用邻接表表示法创建无向,然后使用非递归算法进行深度优先遍历广度优先遍历
Java实现二叉树的深度优先遍历广度优先遍历算法示例
08-27
主要介绍了Java实现二叉树的深度优先遍历广度优先遍历算法,结合实例形式详细分析了二叉树的定义、深度优先遍历广度优先遍历算法原理与相关操作实现技巧,需要的朋友可以参考下
深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
02-04 5112
1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1、首以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点; 2、当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。 在此我想用一句话来形容 “不到南墙不回头” 1.1 无向深度优先遍历解 以下"无向"为例: 对上无向进行深度优先遍历,从A开始:...
算法深度优先遍历广度优先遍历
热门推荐
OceanStar的博客
01-13 6万+
什么是深度、广度优先遍历 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历当中所有顶点的两种方式。 这两种遍历方式有什么不同呢? 举个例子。我们来到一个游乐场,游乐场里有11个景点。我们从景点0开始,要玩遍游乐场的所有景点,可以有什么样的游玩次序呢? 第一种是一头扎到底的玩法。我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。 在中,我们首选择
广度优先遍历深度优先遍历
最新发布
墨城烟柳ベ旧人殇的博客
06-23 924
新星计划:C语言数据结构与算法赛道,创作打卡2!本文主要是上一篇博客学习了用C语言实现的相关操作后,继续进行的遍历操作。
算法总结-深度优先遍历广度优先遍历
hhhlizhao的博客
04-11 1万+
所以广度优先遍历也叫层序遍历,遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。(1)、我们从根节点1开始深度优先遍历,它相邻的节点有2、3、4,依遍历节点2,再遍历2的边节点5,再遍历9,至此便无可遍历的节点。对于每个节点来说,遍历当前节点,然后把节点压栈,再压左节点(这样弹栈的时候会拿到左节点遍历,符合深度优先遍历要求)。广度优先遍历,指的是从的一个未遍历的节点出发,遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。
的遍历——深度优先遍历广度优先遍历
m0_72579201的博客
02-08 4927
的遍历需要定义一个辅助数组以记录某个顶点是否曾被访问,其遍历方式分为深度优搜索与广度优搜索。深度优搜索符合递归的特性,广度优搜索需要一个队列结构以实现的层序遍历。这两种遍历方式的时间与空间复杂度在所选用的存储结构相同的情况下相同,也就是所搜索算法的复杂度与搜索方式本身无关,与的存储结构有关。一般而言,稠密选用邻接矩阵存储,稀疏选取邻接表存储。
连通里的深度优广度优先遍历
sanqima的专栏
10-05 1万+
中的某个顶点出发,按照某种搜索方法沿着的边访问中的所有顶点,使得每个顶点仅被访问一次,这个过程称为的遍历。的遍历有两种:深度优先遍历广度优先遍历。   分为连通和非连通,这里主要讨论连通的深度、广度优先遍历。   一、深度优先遍历   深度优先遍历类似于树的序遍历,它的基本思想是:首访问指定的起始顶点vv, 然后选取与vv邻接的未被访问的任意一个顶点ww, 访问之
的遍历 深度优先遍历 广度优先遍历
qq_41078889的博客
02-14 3122
的遍历和树的遍历类似的,从中某一顶点出发遍访中其余顶点,且使每个顶点只被访问一次,这个过程叫做的遍历。 那么复杂,因为它的任一顶点都可能和其余的所有顶点相邻接,极有可能存在沿着某条路径搜索后,又回到原顶点,而有些顶点却还没有遍历到的情况。因此我们需要在遍历过程中把访问过的顶点打上标记,以避免访问多次而不自知。具体办法是设置-一个访问数组 visited[n], n是中顶点的个数,初值......
的遍历(深度优搜索法和广度优搜索法)
weixin_34245169的博客
06-13 326
为什么80%的码农都做不了架构师?>>> ...
的遍历 (深度优先遍历广度优先遍历
qq_52252193的博客
11-13 2万+
一. 什么是深度优先遍历 深度优先遍历可定义如下:首访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至中所有和源点v有路径相通的顶点均已被访问为止。若此时中仍有未访问的顶点,则另选一个尚未访问的顶点为新的源点重复上述过程,直至中所有的顶点均已被访问为止。 深度优先遍历结果是: A B E F C D G H 深度优先遍历尽可能优往深层次进行搜索 二.广度优先遍历 广度优先遍历可定...
的遍历之深度优搜索和广度优搜索
生活需要深度
07-01 742
1. 深度优搜索介绍的深度优搜索(Depth First Search),和树的序遍历比较类似。它的思想:假设初始状态是中所有顶点均未被访问,则从某个顶点v出发,首访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优搜索遍历,直至中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至中所有顶点都被访问到为止。显然,深度优搜索是一个递归的过程。2. 深度优搜索解2.1 无向的深度优搜索下面以"无向"为例,来
实现深度优先遍历广度优先遍历算法
05-04
以下是Python实现的深度优先遍历广度优先遍历算法: ```python from collections import deque class Graph: def __init__(self, vertices): self.vertices = vertices self.adj_list = {v: [] for v in vertices} def add_edge(self, u, v): self.adj_list[u].append(v) self.adj_list[v].append(u) def dfs(self, start): visited = set() self._dfs(start, visited) def _dfs(self, v, visited): visited.add(v) print(v, end=' ') for neighbor in self.adj_list[v]: if neighbor not in visited: self._dfs(neighbor, visited) def bfs(self, start): visited = set() queue = deque([start]) visited.add(start) while queue: v = queue.popleft() print(v, end=' ') for neighbor in self.adj_list[v]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) ``` 上述代码中,Graph类表示一个,使用邻接表来存储的信息。add_edge方法用于添加边,dfs方法和_bfs方法分别实现深度优先遍历广度优先遍历。在dfs方法中,使用递归实现深度优先遍历;在bfs方法中,使用队列实现广度优先遍历

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • JS:变量定义和赋值 6777
  • Linux安装jdk1.8和配置环境变量 6022
  • GIT:使用TortoiseGit进行分支的操作 4477
  • JS:三种常用的函数定义方式 4238
  • StringBuffer扩容的简单理解 3179

分类专栏

  • DATASTRUCTUREANDALGORITHM 20篇
  • COMPUTERBASICS
  • PROBLEMS 5篇
  • JAVA 48篇
  • IDE 8篇
  • CLEANCODE 3篇
  • UPWIDE
  • WEB 19篇
  • FRAME 15篇
  • ENGLISH
  • GOF 23篇
  • DEBUG 3篇
  • VC 7篇
  • LINUX 2篇
  • MAVEN 3篇
  • OTHERS 20篇
  • DB 6篇

最新评论

  • 数据结构与算法——递归回溯

    士别三日wyx: 写的不错, 学到了表情包

  • Linux安装jdk1.8和配置环境变量

    多来哈米: [code=html] export JAVA_HOME=/usr/local/src/jdk/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar [/code]

  • Linux安装jdk1.8和配置环境变量

    多来哈米: 第五步:配置环境变量 这个都不复制出来的吗,我的哥哥

  • MySQL中select语句的执行顺序

    昕光微暖: 我感觉你写的有道理

  • GOOGLE开发者工具之SOURCES

    ctotalk: 坚持。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 算法——最小生成树与最短路径相关算法
  • 算法——贪心算法
  • 算法——KMP算法
2020年45篇
2019年120篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

代开银行存款证明公司黄冈银行定期存单费用北京留学存款证明代发林芝资信证明哪里有济宁定期存单定制宿迁本地企业资金证明长治制作企业资金证明惠州银行定期存单查询黄冈资信证明定做邵阳银行定期存单哪里有长治出国留学存款证明公司新余留学存款证明费用佳木斯资金证明服务商资阳打印企业资信证明益阳出国留学资金证明代做锦州代做定期存单龙岩定期存单样本林芝本地企业资金证明崇左留学存款证明用途梧州代开出国留学存款证明河池存款证明怎么打濮阳开资信证明松原企业资信证明服务商宜春定做定期存单黑河企业资信证明多少钱四平银行定期存单公司绵阳企业资金证明打印宜宾出国留学存款证明怎么样达州出国留学存款证明供应商安顺资金证明办理葫芦岛出国留学存款证明怎么打香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

代开银行存款证明公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化