当前位置: 首页 > news >正文

国内最便宜机票网站建设手机小游戏网站

国内最便宜机票网站建设,手机小游戏网站,wordpress微信登录页面模板,菠菜网站怎么做排名深度优先遍历(Depth First Search#xff0c;简称DFS) 与广度优先遍历(Breath First Search#xff0c;简称BFS)是图论中两种非常重要的算法#xff0c;生产上广泛用于拓扑排序#xff0c;寻路(走迷宫)#xff0c;搜索引擎#xff0c;爬虫等。 一、深度优先遍历 深度优先…深度优先遍历(Depth First Search简称DFS) 与广度优先遍历(Breath First Search简称BFS)是图论中两种非常重要的算法生产上广泛用于拓扑排序寻路(走迷宫)搜索引擎爬虫等。 一、深度优先遍历 深度优先遍历的思路是从图的一个未访问的顶点V开始沿着一条路一直走到底然后从这条路尽头的节点回退到上一个节点再从另一条路开始走到底不断递归重复此过程…直到所有的顶点都遍历完成。它的特点说通俗了就是不撞南墙不回头走完了一条路再换一条路继续走。 树是图的一种特例 联通无环的图就是树接下来我们来看树用深度优先遍历该怎么遍历。 1、深度优先遍历过程 1、我们从根节点1开始深度优先遍历它相邻的节点有2、3、4依先遍历节点2再遍历2的右边节点5再遍历9至此便无可遍历的节点。 2、上图中一条路径已经遍历到底此时从叶子节点9回退到上一节点5看下节点 5 是否还有除 9 以外的节点没有继续回退到 22 也没有除 5 以外的节点回退到 11 有除 2 以外的节点 3所以从节点 3 开始进行深度优先遍历如下 3、同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点再往上回溯发现3有除 6 以外的子节点 7所以此时会遍历 7。 4、从 7 往上回溯到 3 1发现 1 还有节点 4 未遍历所以此时沿着 4 8 进行遍历这样就完成了整个遍历过程。 完整的节点的遍历顺序如下(节点上的的蓝色数字代表) 相信大家看到以上的遍历不难发现这就是树的前序遍历实际上不管是前序遍历还是中序遍历亦或是后序遍历都属于深度优先遍历。 那么深度优先遍历该怎么实现呢有递归和非递归两种表现形式接下来我们以二叉树为例来看下如何分别用递归和非递归来实现深度优先遍历。 2、深度优先遍历实现 1、递归 递归实现比较简单由于是前序遍历所以我们依次遍历当前节点左节点右节点即可对于左右节点来说依次遍历它们的左右节点即可依此不断递归下去直到叶节点(递归终止条件)代码如下 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; } } public static void dfs(Node treeNode) { if (treeNode null) { return; } process(treeNode); // 遍历节点dfs(treeNode.left); // 遍历左节点dfs(treeNode.right); // 遍历右节点} } 递归的表达性很好也很容易理解不过如果层级过深很容易导致栈溢出。所以我们重点看下非递归实现。 2、非递归 仔细观察深度优先遍历的特点对二叉树来说由于是先序遍历(先遍历当前节点再遍历左节点再遍历右节点)所以我们有如下思路 对于每个节点来说先遍历当前节点然后把右节点压栈再压左节点(这样弹栈的时候会先拿到左节点遍历符合深度优先遍历要求)。 弹栈拿到栈顶的节点如果节点不为空重复步骤 1 如果为空结束遍历。 我们以以下二叉树为例来看下如何用栈来实现 DFS。 使用栈来将要遍历的节点压栈然后出栈后检查此节点是否还有未遍历的节点有的话压栈没有的话不断回溯(出栈)有了思路不难写出如下用栈实现的二叉树的深度优先遍历代码 /** * 使用栈来实现 dfs * param root */ public static void dfsWithStack(Node root) { if (root null) { return; } StackNode 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); } } }二、深度优先遍历 广度优先遍历指的是从图的一个未遍历的节点出发先遍历这个节点的相邻节点再依次遍历每个相邻节点的相邻节点。 上面所述树的广度优先遍历动图如下每个节点的值即为它们的遍历顺序。所以广度优先遍历也叫层序遍历先遍历第一层(节点 1)再遍历第二层(节点 234)第三层(5678)第四层(910)。 深度优先遍历用的是栈而广度优先遍历要用队列来实现我们以下图二叉树为例来看看如何用队列来实现广度优先遍历。 代码实现如下 /** * 使用队列实现 bfs * param root */ private static void bfs(Node root) { if (root null) { return; } QueueNode stack new LinkedList(); stack.add(root); while (!stack.isEmpty()) { Node node stack.poll(); System.out.println(value node.value); Node left node.left; if (left ! null) { stack.add(left); } Node right node.right; if (right ! null) { stack.add(right); } } } 若想通过实战来进一步理解DFS,BFS可以看LeetCode如下题目这是一道典型的DFS,BFS题目。 leetcode 104111: 给定一个二叉树找出其最大/最小深度。
http://www.hkea.cn/news/14351087/

相关文章:

  • 广东网站建设电话外链生成网站
  • 重庆网站建设与网络推广石家庄房产网官网
  • 建立网站的基本流程wordpress评论表情不显示不出来
  • 沈阳哪里可以做网站营销wordpress完整虚拟资源下载
  • 南昌有哪些做网站的公司房产信息网预告是什么意思
  • 越城区住房和城乡建设局网站鲜花电子商务网站建设规划书
  • 宣传型企业网站设计上海电商网站开发
  • 用友公司能不能做网站建设asp 网站图标
  • 网站502 解决办法做网站电商云数据库有用吗
  • 东莞商务网站建设源码之家 网站模板
  • 分享设计的网站河北邢台做网站
  • 网站做ssl证书有风险河北省水利建设市场网站
  • 中国建设报社门户网站漳州网站建设企业
  • 平原县网站建设360全景图制作
  • 集团网站设计思路全网站开发是什么
  • 北京大兴最专业的网站建设公司贵州省交通工程建设质监局网站
  • 建设银行网站入口wordpress如何修改首页模板文件
  • 建设信用卡在线海淘网站返现资金盘网站开发公司哪里好
  • 国外手机模板网站高明铝业网站建站
  • 潍坊专业网站建设哪家便宜手机发布会
  • 网站开发需要哪些文档网站建设常用的开发语言介绍
  • 做网站看网页效果wordpress实现ajax
  • 建设网站成本wordpress黑桃锤击
  • 买过域名之前就可以做网站了吗?建筑施工特种证书查询入口官网
  • app网站公司请输入搜索关键词
  • 网站 搭建 公司专做立体化的网站
  • 郑州做旅游网站的公司深圳做网站优化工资多少
  • wordpress的网站怎么保存电商网站设计说明书
  • 导航网站开发用户文档网站建设方案书制作流程
  • 网站托管如何收费郑州移动网站建设