c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

深度优先搜索算法(Depth First Search)

DFS是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

b42bcbb21133

图片.png

如上图所示的二叉树:

A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。那么,怎么样才能来保证这个访问的顺序呢?

分析一下,在遍历了根结点后,就开始遍历左子树,最后才是右子树。因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。

广度优先搜索算法(Breadth First Search)

又叫宽度优先搜索,或横向优先搜索。是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

b42bcbb21133

图片.png

如上图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。那么,怎样才能来保证这个访问的顺序呢?

借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。这样一来,左子树结点就存在队头,可以先被访问到。

代码实现:

#include

#include

#include

using namespace std;

struct Node

{

int nVal;

Node *pLeft;

Node *pRight;

Node(int val,Node* left=NULL,Node * right=NULL):nVal(val),pLeft(left),pRight(right){}; //构造

};

// 析构

void DestroyTree(Node *pRoot)

{

if (pRoot==NULL)

return;

Node* pLeft=pRoot->pLeft;

Node* pRight=pRoot->pRight;

delete pRoot;

pRoot =NULL;

DestroyTree(pLeft);

DestroyTree(pRight);

}

// 用queue实现的BFS

void BFS(Node *pRoot)

{

if (pRoot==NULL)

return;

queue Q;

Q.push(pRoot);

while(!Q.empty())

{

Node *node = Q.front();

cout<nVal<";

if (node->pLeft!=NULL)

{

Q.push(node->pLeft);

}

if (node->pRight!=NULL)

{

Q.push(node->pRight);

}

Q.pop();

}

cout<

}

// DFS的递归实现

void DFS_Recursive(Node* pRoot)

{

if (pRoot==NULL)

return;

cout<nVal<

if (pRoot->pLeft!=NULL)

DFS_Recursive(pRoot->pLeft);

if (pRoot->pRight!=NULL)

DFS_Recursive(pRoot->pRight);

}

// DFS的迭代实现版本(stack)

void DFS_Iterative(Node* pRoot)

{

if (pRoot==NULL)

return;

stack S;

S.push(pRoot);

while (!S.empty())

{

Node *node=S.top();

cout<nVal<

S.pop();

if (node->pRight!=NULL)

{

S.push(node->pRight);

}

if (node->pLeft!=NULL)

{

S.push(node->pLeft);

}

}

}

// 打印树的信息

void PrintTree(Node* pRoot)

{

if (pRoot==NULL)

return;

cout<nVal<

if (pRoot->pLeft!=NULL)

{

PrintTree(pRoot->pLeft);

}

if (pRoot->pRight!=NULL)

{

PrintTree(pRoot->pRight);

}

}

int main()

{

Node *node1=new Node(4);

Node *node2=new Node(5);

Node *node3=new Node(6);

Node* node4=new Node(2,node1,node2);

Node* node5=new Node(3,node3);

Node* node6=new Node(1,node4,node5);

Node* pRoot = node6;

//PrintTree(pRoot);

//DFS_Recursive(pRoot);

DFS_Iterative(pRoot);

DestroyTree(pRoot);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言 子进程,子Shell和子进程

Shell 中有很多方法产生子进程&#xff0c;比如以新进程的方式运行 Shell 脚本&#xff0c;使用组命令、管道、命令替换等&#xff0c;但是这些子进程是有区别的。子进程的概念是由父进程的概念引申而来的。在 Linux 系统中&#xff0c;系统运行的应用程序几乎都是从 init(pid为…

学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...

原标题&#xff1a;为什么不建议买游戏本&#xff1f;入手前须知&#xff0c;别只看中游戏作为一名游戏本用户&#xff0c;我自己在用的游戏本已经用了四五年的时间了&#xff0c;从最初的大学生到毕业工作2年时间&#xff0c;这一游戏本给我带来了不少麻烦。最大的麻烦就是“笨…

Android ui 单元测试 覆盖率,Android单元测试—UI测试(Espresso)

前言我们先回顾一下&#xff0c;在上一篇博客中&#xff0c;主要分享了Android单元测试的逻辑测试部分。接下来&#xff0c;我们重点讲解Android单元测试的UI测试部分&#xff01;何为UI测试呢&#xff1f;就是对用户界面的交互元素进行测试&#xff0c;如TextView、ImageView&…

android shape 圆角百分比,Android shape显示圆角问题

当需要定义一个圆角效果,当在ADT中预览,没有有效果时,只要运行就可以了&#xff01;xmlns:Android"http://schemas.android.com/apk/res/android">android:state_pressed"true">android:startColor"#ff8c00"android:endColor"#FFFFFF…

android 删除垃圾文件夹,别再用手机管家清理垃圾了!删除这些文件夹,内存瞬间释放几个G...

随着手机使用时间的增加&#xff0c;手机中缓存的东西越来越多&#xff0c;这时候手机内存空间就会告急&#xff0c;从而影响手机的流畅性。那么在这种时候不要乱清理&#xff0c;我们只需要删除这几个文件夹&#xff0c;就可以帮手机轻松释放好几个G的内存。下面我们就一起来看…

计算机的应用技术课程的看法,统计教学与计算机应用的几点看法论文

统计教学与计算机应用的几点看法论文一、传统教学方法的局限性和弊端统计学是一门关于搜集、整理、汇总、描述和分析数据资料&#xff0c;并在此基础上进行推断和决策的方法论科学&#xff0c;具有很强的应用性、实践性。统计学课程是中等职业学校、财经类专业的基础核心课程。…

jupyter可以打开HTML文件吗,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...

前面用了很久Notebook来交互式编程了&#xff0c;此次说说几个其余的选项&#xff1a;htmlNotebook Markdown此次选Markdown模式(关于Markdown基础能够看以前写的Markdown Base)python和代码同样&#xff0c;Shift回车就能够预览了&#xff0c;怎么样是否是很酷的感受&#xff…

计算机网络技术基础教学内容,计算机网络技术基础

无计算机网络技术基础》课程教案一 计算机网络技术基础》课题&#xff1a; 课题&#xff1a;计算机网络概述(一) ) 教学顺序&#xff1a; 教学顺序&#xff1a;1 教学时数&#xff1a; 教学时数&#xff1a; 2 学时 教学目的&#xff1a;了解计算机网络产生的背景&#xff0c;掌…

计算机表格收入水平怎么算,怎么用excel计算工资所得税

利用Excel表格计算工资所得税?单位工资发放大多采用计算机管理,对一些小企业没有采用工资软件的,一般用Excel表来计算工资。下面小编就教你怎么用excel计算工资所得税。excel计算工资所得税的步骤&#xff1a;1、假设工资的所得税起征点为3500&#xff0c;具体阶段如下表。2、…

同一网段计算机无法共享打印机,Win7同一个局域网内共享打印机不成功的修复方法...

打印机共享需要在同一个局域网内完成&#xff0c;这样打印机可以共享多台电脑。一位用户说自己的打印机和台式Win7系统电脑的连接已经成功&#xff0c;但就是没办法打印机文件&#xff0c;怎么回事呢&#xff1f;win7系统共享打印机的前提是需要关闭杀毒软件和win7系统的防火墙…

嵌入式计算机的特点和应用,以下描述中,()不是嵌入式操作系统的特点。A.面向应用,可以进行裁剪和移植B.用 - 信管网...

第4题&#xff1a;在分布式数据库中包括分片透明、复制透明、位置透明和逻辑透明等基本概念&#xff0c;其中&#xff1a;()是指局部数据模型透明&#xff0c;即用户或应用程序无需知道局部场地使用的是哪种数据模型。A&#xff0e;分片透明B&#xff0e;复制透明C&#xff0e;…

计算机二维全息图原理,三维信息加密如何使用计算全息进行

全息加密技术作为一种特殊的加密方法被广泛应用于信息加密和防伪等领域。在全息加密过程中&#xff0c;光波的波长、记录距离和入射角度等参数用做加密密钥和解密密钥被人们深入研究&#xff0c;但所加密的信息几乎都是二维信息。为此利用一种基于虚拟光学的对三维信息进行加密…

hashmap为什么是2的倍数_HashMap源码解析(jdk1.8)

HashMap在java中使用的频率很高&#xff0c;同时也是面试时的必问的问题。今天咱们就来学习下jHashMap的源码&#xff0c;版本为jdk1.8。学习之前&#xff0c;先一起了解下HashMap的数据结构&#xff0c;便于理解后面所讲的内容。HashMap的底层数据结构由图可见&#xff0c;Has…

消息队列_消息队列:kafka

概念kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。要理解kafka首先要有分布式的概念&#xff0c;要有消息队列的概念。分布式系统最大的优势就是解耦和削峰&#xff0c;这种情况下&#xff0c;A系统生成了一个消息&#xff0c;B系统…

kopernio显示无效程序_陆风路虎外观设计专利无效案一锤定音,最高法:陆风X7专利无效...

点击上方“华商报”可快速关注哦&#xff01;持续5年多的路虎、陆风外观设计专利有效性之争终于尘埃落定&#xff1a;华商报记者日前从代理律师处获悉&#xff0c;最高人民法院近日驳回了江铃控股有限公司的再审请求&#xff0c;这意味着&#xff0c;陆风X7的外观专利无效。陆风…

掩膜区域内像素值_MRI ADC值是怎么来的?咱们来手算一下

首发公众号“医影杂记”ADC&#xff08;Apparent diffusion coefficient&#xff09;&#xff0c;表观弥散系数&#xff0c;用于描述DWI序列中不同方向的分子扩散运动的速度和范围&#xff0c;是MRI DWI&#xff08;Diffusion-weighted imaging, 弥散加权成像&#xff09;中最常…

计算机上的查找替换功能快速格式化,Word2013文档中使用查找和替换功能来快速更改文本格式的方法...

在对文档进行处理时灵活使用Word的查找和替换功能将能够取得事半功倍的效果。下面介绍Word2013文档中使用查找和替换功能来快速更改文本格式的方法。1、在“开始”选项卡中单击“编辑”组中的“替换”按钮&#xff0c;打开“查找和替换”对话框&#xff0c;切换到“替换”选项卡…

composer 依赖包版本冲突_composer快速入门教程

php中文网最新课程每日17点准时技术干货分享Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库&#xff0c;Composer 会帮你安装这些依赖的库文件&#xff0c;有了它&#xff0c;我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目…

极品飞车ol服务器维护,《极品飞车OL》配件升级常见问题介绍

今天九游和大家讲解《极品飞车OL》配件升级常见问题介绍极品飞车OL游戏中&#xff0c;玩家们是需要不断使用配件加强自己的车辆来提升能力值。那么关于配件升级玩家们整体的有什么问题呢&#xff1f;下面小编也为大家带来了相关的介绍。感兴趣的玩家快来看看吧。《极品飞车OL》…

linq判断集合中相同元素个数_JavaSe集合的概念以及集合框架介绍

###集合今天任务1.概念1.1 集合的概念1.2 集合的框架结果介绍1.3 集合和数组的对比 2.Collection接口2.1 Collections中常用的方法 3.泛型3.1 什么是泛型3.2 泛型的声明3.3 说明3.4 泛型使用时的注意事项3.5 受限泛型3.6 泛型应用在集合上 4.Iterator迭代器4.1 迭代器的工作原理…