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;这一游戏本给我带来了不少麻烦。最大的麻烦就是“笨…

LL1文法的判别c语言,编译原理实验七:LL1文法的判断

《编译原理实验七&#xff1a;LL1文法的判断》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《编译原理实验七&#xff1a;LL1文法的判断(11页珍藏版)》请在人人文库网上搜索。1、实验七&#xff1a;LL(1)文法的判断 一&#xff1a;要求输入&#xff1a;任意的上下文无…

如何用c语言倒序输出字母,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include void fun (char *ch1, char *ch2){int i, n(0), k;int length;bool judge(true);for (length 0; *(ch1 length) ! \0; length );// 计算ch1长度for (i length - 1; i > 0; i --){if (*(ch1 (length - 1))…

AVR单片机计算器C语言源程序,AVR单片机简单计算器的Proteus仿真实现+源码

#include "mega16.h"#include "1602.h"#include "key.h"float k1,k2; //记录最终输入运算的两个数uint one,two,three,four; //记录每次输入的数字uint flag; //计数标志位uint flag1,flag2; //第一个数 第二…

android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...

本文已授权「刘望舒」微信公众号独家原创发布前言本文将直接使用RxHttp库实现文件上传、下载、断点下载、进度的监听&#xff0c;不对RxHttp做过多讲解&#xff0c;如果对RxHttp不了解&#xff0c;请移步本文目的在于让更多的读者知道RxHttp库&#xff0c;如果您已阅读上面4篇文…

Android中http断点下载,Android HttpURLConnection断点下载(单线程)

HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类&#xff1a;Android 6.0之后取消了HttpClient&#xff0c;不支持跟新 &#xff0c;今天小编使用的是HttpURLConnection &#xff1a;直接上代码&#xff1a;URL url null;BufferedInputStream bin null;Ht…

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 png模拟svg,Android 中使用svg图片

1. svg认识SVG&#xff1a;android5.0出现&#xff0c;w3c推出使用xml 描述二维图形语言,矢量图,放大缩小无影响为什么用svg,现在手机的短板是内存,不是cpu,svg通过cpu计算&#xff0c;png占用内存Android上对svg进行阉割&#xff0c;使用Vector Drawable对svg支持&#xff0c;…

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

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

android软件perthbus,Transit

v5.9.10版更新说明(2021-03-19)Whether you’re riding transit for business, pleasure, or to get shredded from a socially-spaced-out bus ballet, you’ll notice “Favourite destination” icons have been newly primped to prom perfection.What else? Hello Free2M…

HTML中scr是图片的什么,HTML中关于url、scr、href的区别

HTML中关于url、scr、href的区别URL是什么URL&#xff1a;Uniform Resource Locators(统一资源定位器)的简写&#xff0c;Web浏览器通过URL从Web服务器请求页面。url不是属性&#xff0c;src和href是属性&#xff0c;src用于替换当前元素&#xff0c;href用于在当前文档和引用资…

html5页面结构案例,前端学习笔记(五)HTML+CSS静态页面实战案例:幸福西饼首页和百度首页...

按照知乎上面汪小黑推荐的前端学习路径&#xff0c;在自学了HTML和CSS之后&#xff0c;开始尝试实战制作静态页面小项目。幸福西饼首页制作首先我在网上下载到了千锋教育提供的的幸福西饼官网静态页面的教学视频和图片素材、源码等。我是先看一集视频&#xff0c;然后关掉视频自…

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

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

计算机应用基础试卷结果分析,计算机应用基础 试题

计算机应用基础 试题计算机应用基础的试题有哪些?打击知道吗?下面小编为大家带来计算机应用基础试题&#xff0c;仅供参考&#xff0c;希望能够帮到大家。计算机应用基础试题选择题:1、现代信息社会的主要标志是 ___ 。(A) 汽车的大量使用 (B) 人口的日益增长 (C) 自然环境的…

中国石油大学计算机专业调剂信息,2014年中国石油大学(北京)计算机专业考研调剂信息(新)...

写在前面&#xff1a;随着2014年34所自主划线院校考研分数线及国家线的公布&#xff0c;2014年考研复试、调剂工作也陆续拉开序幕。为了帮助更多考生顺利通过复试&#xff0c;考研论坛特开启复试调剂答疑活动&#xff0c;解答2014年考生有关考研复试和调剂的问题&#xff0c;为…

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

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

计算机专业毕业论文指导记录详细,毕业论文指导记录怎么写 了解一下

1、指导记录总共6次&#xff0c;请各位同学按照法学院网站上公布的毕业论文写作进度确定每次指导记录的时间。同时根据自己的论文选题和实际情况&#xff0c;可稍作调整。2、第一次&#xff1a;根据学院的统一部署&#xff0c;布置学生毕业论文写作的总体要求与进度&#xff0c…

计算机专业会议评级,2018计算机专业工程教育认证研讨会

为帮助计算机专业了解我国工程教育认证进展、理解认证标准的本质、引导专业建立正确的认证观&#xff0c;落实以认证推进专业建设和完善内部质量保障体系、以认证工作推进一流专业建设&#xff0c;把认证和专业改革发展有机结合&#xff0c;提高计算机教学教育的质量。中国计算…