深度优先遍历与广度优先遍历(c++二叉树算法实现)

C++ 算法篇 广度(宽度)优先搜索(BFS) 广度优先遍历 广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS。 图的BFS类似于树的层序遍历。 广度优先遍历 如图将左边的图变形,得到右边的图,然后一层一层的遍历。 这里借助一个队列来实现一层一层的遍历。 邻接矩阵的BFS 核心代码 /** * 邻接矩阵的广度优先遍历算法 */ void BFSTraverse(MGraph G){... 阅读详情

1.深度优先遍历的递归定义

  假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。

  图的深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-First Search)。相应地,用此方法遍历图就很自然地称之为图的深度优先遍历

 

2.基本实现思想:

(1)访问顶点v;

(2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;

(3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。

 

3.伪代码

递归实现

(1)访问顶点v;visited[v]=1;//算法执行前visited[n]=0

(2)w=顶点v的第一个邻接点;

(3)while(w存在)  

           if(w未被访问)

                   从顶点w出发递归执行该算法; 
           w=顶点v的下一个邻接点;

 

非递归实现

 (1)栈S初始化;visited[n]=0;

 (2)访问顶点v;visited[v]=1;顶点v入栈S

 (3)while(栈S非空)

            x=栈S的顶元素(不出栈);

            if(存在并找到未被访问的x的邻接点w)

                    访问w;visited[w]=1;

                    w进栈;

            else

                     x出栈;

 广度优先遍历

1.广度优先遍历定义

 图的广度优先遍历BFS算法是一个分层搜索的过程,和树的层序遍历算法类同,它也需要一个队列以保持遍历过的顶点顺序,以便按出队的顺序再去访问这些顶点的邻接顶点。 

2.基本实现思想

(1)顶点v入队列。

(2)当队列非空时则继续执行,否则算法结束。

(3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。

(4)查找顶点v的第一个邻接顶点col。

(5)若v的邻接顶点col未被访问过的,则col入队列。

(6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。

        直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。

广度优先遍历图是以顶点v为起始点,由近至远,依次访问和v有路径相通而且路径长度为1,2,……的顶点。为了使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,需设置队列存储访问的顶点。

3.伪代码

(1)初始化队列Q;visited[n]=0;

(2)访问顶点v;visited[v]=1;顶点v入队列Q;

(3) while(队列Q非空)   

              v=队列Q的对头元素出队;

              w=顶点v的第一个邻接点;

             while(w存在) 

                     如果w未访问,则访问顶点w;

                     visited[w]=1;

                     顶点w入队列Q;

                     w=顶点v的下一个邻接点。

转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/18/2596983.html

递归深度优先遍历:分为先序、中序、后序遍历

  1. //前序遍历  
  2. void PreOrderTraverse(BiTree T)  
  3. {  
  4.     if(T){  
  5.         printf("%c ",T->ch);  
  6.         PreOrderTraverse(T->lchild);  
  7.         PreOrderTraverse(T->rchild);  
  8.     }  
  9. }  
  10.   
  11. //中序遍历  
  12. void InOrderTraverse(BiTree T)  
  13. {  
  14.     if(T){  
  15.         InOrderTraverse(T->lchild);  
  16.         printf("%c ",T->ch);  
  17.         InOrderTraverse(T->rchild);  
  18.     }  
  19. }  
  20.   
  21. //后序遍历  
  22. void PostOrderTraverse(BiTree T)  
  23. {  
  24.     if(T){  
  25.         PostOrderTraverse(T->lchild);  
  26.         PostOrderTraverse(T->rchild);  
  27.         printf("%c ",T->ch);  
  28.     }  
  29. }

非递归深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。先序遍历如下所示,中序和后序同理~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//深度优先遍历二叉树void depthFirstSearch(Tree root){
    stack<node *=""> nodeStack;  //使用C++的STL标准模板库
    nodeStack.push(root);
    Node *node;
    while(!nodeStack.empty()){
        node = nodeStack.top();
        printf(format, node->data);  //遍历根结点
        nodeStack.pop();
        if(node->rchild){
            nodeStack.push(node->rchild);  //先将右子树压栈
        }
        if(node->lchild){
            nodeStack.push(node->lchild);  //再将左子树压栈
        }
    }
}
</node>

 

广度优先遍历:是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//广度优先遍历
void breadthFirstSearch(Tree root){
    queue<node *=""> nodeQueue;  //使用C++的STL标准模板库
    nodeQueue.push(root);
    Node *node;
    while(!nodeQueue.empty()){
        node = nodeQueue.front();
        nodeQueue.pop();
        printf(format, node->data);
        if(node->lchild){
            nodeQueue.push(node->lchild);  //先将左子树入队
        }
        if(node->rchild){
            nodeQueue.push(node->rchild);  //再将右子树入队
        }
    }
}
</node>
转自:http://www.cnblogs.com/calamus/p/5877758.html
Nano Banana 2哪里使用?Nano Banana 2提示词合集和使用教程 收集最强的Nano Banana 2提示词合集,以及Nano Banana 2哪里使用的教程,并且有10个免费使用渠道。 阅读详情

相关推荐

uniapp中renderjs实战:手把手教你实现SSE即时通讯(附完整代码)

本文通过一个完整的实战案例,详细讲解了如何在uni-app中使用RenderJS实现SSE即时通讯功能。文章剖析了RenderJS作为Vue视图层强力补充的原理,并提供了包含自动重连、状态管理等健壮性设计的完整代码,帮助开发者突破框架限制,高效集成浏览器原生API。

weixin_29005499的博客 189

深度优先遍历与广度优先遍历

深度优先遍历 1.深度优先遍历的递归定义   假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访...

weixin_34068198的博客 739

嵌入式人工智能(18-基于树莓派4B的继电器JQC-3FF-S-Z)

本次实验的输出端控制不会接强电,就用LED灯来模拟即可,由于我那个流水灯模块是低电平点亮,所以接线稍有不同,同学们注意。只有继电器吸合,输出端的NO与COM就导通,给LED低电平然后就亮,否则继电器断开,NO与COM不导通,LED不亮。原理都一样,控制电流的接通与断开,这个模块看起来还简单点,毕竟还有2个指示灯,下端IN如接上电源红灯亮,继电器动作有电流通过绿灯亮。在实际应用中,可以通过编程控制继电器的通断状态,例如在Python编程中设置继电器模块的通断时间,从而实现自动化控制。

u010152658的博客 2531

图的遍历(深度、广度)——C/C++

图的基础:https://blog.youkuaiyun.com/weixin_42109012/article/details/94140343 队列基础:https://blog.youkuaiyun.com/weixin_42109012/article/details/92104948 例子: 一、深度优先遍历 1、算法思想 (1)从图中的某个初始点 v 出发,首先访问初始点 v. (2)选择一个与顶点 v 相...

有人_295的博客 1万+

AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真_aoa定位算法

如图所示,有基站 S 1 ( x 1 , y 1 , z 1 ) , S 2 ( x 2 , y 2 , z 2 ) S_1(x_1,y_1,z_1),S_2(x_2,y_2,z_2) S1​(x1​,y1​,z1​),S2​(x2​,y2​,z2​),目标 T ( x , y , z ) T(x,y,z) T(x,y,z)。2+(z_1-z_2)^2} step1:两基站间的距离L=(x1−x2)2+(y1​−y2​)2+(z1​−z2​)2。

2401_87555613的博客 1482

5G物理层基础知识

1、关于RB和RE (1) RB(Resource Block,资源块)频率上连续12个子载波,时域上一个slot(时隙,14个ofdm符号) (2) RE(Resource Element,资源单元)频率上一个子载波,及时域上一个ofdm符号 注意:协议规定,5G每个时隙(非扩展CP)的符号数为14个(扩展CP情况下每个时隙有12个符号),而LTE(非扩展CP)每个时隙的符号数为7个。 简单说:一个12X14的方格,大的整个叫一个RB,每一个小块叫一个RE。另外,一个RE可存放一个调制符号(mo.

qq_39074243的博客 2万+

C++实现图的深度优先遍历和广度优先遍历

图的深度和广度优先遍历 图的深度优先遍历 1、算法思想 2、邻接矩阵构造图 3、邻接表构造图 图的广度优先遍历 1、算法思想 2、邻接矩阵构造图 图的深度优先遍历 1、算法思想 (1)从图中的某个初始点 v 出发,首先访问初始点 v. (2)选择一个与顶点 v 相邻且没被访问过的顶点 ver ,以 ver为初始顶点,再从它出发进行深度优先遍历。 (3)当路径上被遍历完,就访问上一个顶点的第 二个相邻顶点。 (4)直到所有与初始顶点 v联通的顶点都被访问。 2、邻

KOwzb的博客 2618

matlab2021a版本条件下安装spm

SPM (Statistical Parametric Mapping),中文名叫统计参数映射。统计参数映射是指构建和评估空间扩展的统计过程,用于测试关于功能成像数据的假设。这些想法已经在名为SPM的免费开源软件中得到了实例化。SPM软件包用于脑成像数据序列分析。目前的版本可以分析fMRI, PET, SPECT, EEG和MEG。 可能由于matlab版本更新的问题,按照之前教程所写的安装方法会出现错误,踩了一些坑,但好在最终解决了。。。 1、下载链接,如下 SPM12 Software -...

qq_42356925的博客 8405

(超详细)C++图的深度优先遍历、广度优先遍历(数据结构)

(超详细)C++图的深度优先遍历、广度优先遍历(数据结构)。根据下图,编写代码实现图的深度优先遍历和广度优先遍历。按照英文字母顺序,以邻接表为存储结构,实现图的深度优先和广度优先遍历。遍历的顺序从顶点a开始。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。

m0_54158068的博客 2万+

【OCPP】ocpp1.6J协议框架说明

本文档的目的是为读者提供创建正确的可互操作 OCPP JSON 实现 (OCPP-J) 所需的信息。我们将根据我们自己的经验,尝试解释什么是强制性的、什么是良好做法以及什么是不应该做的。毫无疑问,误解或歧义仍然存在,但我们旨在通过本文件尽可能地防止它们。IANA:互联网数字分配机构(OCPP-J:使用JSON通过WebSocket进行OCPP通信。特定的OCPP版本应使用J扩展进行指示。OCPP1.5J表示我们正在讨论1.5版本的JSON/WebSocket实现。

qq_53871375的博客 1241

微信小程序 - 下单账号和支付账号不一致,请核实后再支付(微信小程序或微信H5页面/微信公众号网页支付时报错:“下单账号和支付账号不一致,请核实后再支付”,买家微信支付时提示错误)详细排查和解决方案!

微信支付出现 “下单账号与支付账号不一致,请核实后再支付”微信小程序下单账号与支付账号不一致不让支付,微信公众号网页 微信H5页面JS-SDK支付时出现错误:下单账号和支付账号不一致,请核实后再支付,openId导致的微信中“下单账号和支付账号不一致”原因及解决办法,调用统一下单所传openId与实际支付用户的openId不一致,微信支付jssdk报错,检查了没有不一致依然报错怎么办,微信支付下单账号和支付账号不一致,请核实后再支付,微信支付功能用JSAPI支付,H5页面负责下单并支付jsapi,微信调起支

🏆 前端领域优质创作者 5330

二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]

二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ] Posted on 2013-02-03 12:52 fancydeepin 阅读(3341) 评论(0)  编辑  收藏 所属分类: 数据结构         深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 当节点v的所有边都己被探寻过,搜索

起点 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Binary Tree Traversal Algorithms (二叉树遍历算法)

本文共列出了11个常见的二叉树遍历算法。二叉树的遍历主要有深度优先遍历和广度优先遍历。深度优先遍历包含前序遍历、中序遍历和后序遍历。 值得一提的是, 其中的 Morris 算法 可以线性时间不需要额外空间(用户栈或系统栈空间)实现二叉树的前序遍历、中序遍历和后序遍历。关于Morris算法, 可参考http://www.cnblogs.com/AnnieKim/archive/2013/06/1...

weixin_30881367的博客 183

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

二叉树的深度优先和广度优先遍历

二叉树的深度优先和广度优先遍历 http://steven-hong.javaeye.com/blog/493665 图的深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再 从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,

北风七级的专栏 739

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++二叉树的遍历:深度优先(前序、中序、后序)和广度优先(层次)

准备 深度优先遍历:沿着每一个分支路径进行深入访问。前序、中序、后序都是深度优先遍历的特例。可以用递归实现,非递归一般借助栈容器。 广度优先遍历:又叫层次遍历,对每一层依次访问。可以借助队列容器来实现。 先定义和创建一颗二叉树 #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;queue&gt; #in...

龚建波 6570

浅析二叉树的层序建树及其广度优先遍历、深度优先遍历算法(附图易理解)

本文介绍如何使用C++语言从零开始按层序构建二叉树,给出广度优先算法和深度优先算法,并配以清晰明了的流程图供读者理解。

weixin_71880263的博客 682

数据结构---二叉树的遍历

希望本文章可以帮助到刚学习到二叉树的同学。路漫漫,学习之路还很长远。

逃离世界····· 825

数中漫游C++实现

以上述二叉树为例:广度优先周游二叉树的结果为:A->B->C->D->E->F->G->H->I->J->K->按前序法周游上述二叉树的结果:A->B->D->E->H->C->F->I->G->J->K->按中序法周游上述二叉树的结果:D->B->H->E->A->F->I->C->J->K->G->按后序法周游上述二叉树的结果:D->H->E->B->I->F->K->J->G->C->A->在此介绍两类周游二叉树的方法及代码:深度优先周游和广度优先周游,以此二叉树为例子。其递归定义是:访问根结点;

程序猿老樊的博客 475

定义二叉树类,实现广度优先遍历算法,实现深度优先遍历(先序、中序和后序)的递归和非递归算法。

定义二叉树类,实现广度优先遍历算法,实现深度优先遍历(先序、中序和后序)的递归和非递归算法。 在这部分主要是对二叉树类的定义,以及调用函数,输出广度、深度优先遍历的结果。 // An highlighted block #include<iostream> using namespace std; template<class T> // 队列的定义 class ArrayQueue { private: int maxSize; int front; int rear; T

小新 820

递归法和迭代法都必须掌握的二叉树三种DFS【Py/Java/C++三种语言详解】LeetCode每日一题240212【二叉树】LeetCode145、二叉树的后序遍历

有LeetCode算法/华为OD考试扣扣交流群可加可上全网独家的练习华子OD、大厂真题绿色聊天软件戳od1336了解算法冲刺训练。

weixin_48157259的博客 929

递归法和迭代法都必须掌握的二叉树三种DFS【Py/Java/C++三种语言详解】LeetCode每日一题240210【二叉树】LeetCode94、二叉树的中序遍历

有LeetCode算法/华为OD考试扣扣交流群可加可上全网独家的练习华子OD、大厂真题绿色聊天软件戳od1336了解算法冲刺训练。

weixin_48157259的博客 1058

递归法和迭代法都必须掌握的二叉树三种DFS【Py/Java/C++三种语言详解】LeetCode每日一题240211【二叉树】LeetCode144、二叉树的前序遍历

有LeetCode算法/华为OD考试扣扣交流群可加可上全网独家的练习华子OD、大厂真题绿色聊天软件戳od1336了解算法冲刺训练。

weixin_48157259的博客 908

102.二叉树的层序遍历(leetcode)

我这题的做法很简单,就是使用广度优先算法的思路 high是树的高度,如果说数的高度和数组一样大,那么就说明没有创建过,则需要让二维数组高度+1,并且树的高度也加1,在把数据压入。即可 /** *Definitionforabinarytreenode. *structTreeNode{ *intval; *TreeNode*left; *TreeNode*right; *TreeNode():val(0),...

weixin_43911593的博客 150

二叉树三种遍历方式的六种实现方法 和 层次遍历

基本概念不再赘述,下面直接给出代码: #include <iostream> #include <string> #include <stack> #include <vector> using namespace std; struct Node { int val; Node * left; Node * right; Node(int ...

aift的专栏 1442
上一篇: 二进制中含有1的个数
下一篇: 任意非负整数,求1~n之间含有1的整数的个数
Traveling_DING
博客等级 码龄12年 65粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值