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

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

图片.png

如上图所示的二叉树:

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

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

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

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

图片.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;

}

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

  1. 程序员面试算法_程序员的前20个搜索和排序算法面试问题

    程序员面试算法 大家好,如果您正在准备编程工作面试或正在寻找新工作,那么您知道这不是一个容易的过程. 在您职业的任何阶段,您都必须幸运地接到电话并进行第一轮面试,但是在初学者方面,当您寻找第一份工作时 ...

  2. 【Golang 面试算法二叉树 手动建树】

    Golang 面试算法二叉树 手动建树 前言 代码实现 前言 面试中有很多有关二叉树的题目,且需要手动建树,这里记录一下如何用Golang来快速构建一个二叉树. 代码实现 我们知道二叉树可以扁平化到数 ...

  3. 程序员面试 算法研究 编程艺术 红黑树 机器学习5大系列集锦

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员面 ...

  4. python程序员面试算法宝典pdf-Python程序员面试笔试宝典

    本书是一本讲解Python程序员面试笔试的百科全书,在写法上,除了讲解如何解答Python程序员面试笔试问题以外,还引入了相关知识点辅以说明,让读者能够更加容易理解.本书将Python程序员面试笔试过 ...

  5. 田字格怎么用C语言编写程序,怎么写算法设计

    1. 什么叫算法描述啊 算法描述(Algorithm Description )是指对设计出的算法,用一种方式进行详细的描述,以便与人交流.算法可采用多种描述语言来描述,各种描述语言在对问题的描述能力 ...

  6. c语言 bool_程序的数据要放到哪里呢?|C语言第二篇

    在C语言第一篇里我写到了编译器,在这里补充一个点,文本编辑器,编译器,IDE(集成开发环境)的区别. 文本编辑器是用作编写普通文字的应用软件,如window的记事本,atom,sublime,它常用来 ...

  7. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

  8. Java自学书籍推荐,java程序员面试算法宝典

    前言 说起来开始进行面试是年前倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试.面试官只是和我聊了下他们在做的事情(主要是做双十一这里大促的稳定性保障,偏中间件 ...

  9. go程序员面试算法宝典 pdf_Go程序员面试算法宝典__目录

    前言 面试笔试经验技巧篇 经验技巧1 如何巧妙地回答面试官的问题2 经验技巧2 如何回答技术性的问题3 经验技巧3 如何回答非技术性问题5 经验技巧4 如何回答快速估算类问题5 经验技巧5 如何回答算 ...

最新文章

  1. JSON与JAVA数据的转换
  2. 对比let、const、var的异同
  3. JavaScript(js)的replace问题的解决
  4. html 按钮 按下 状态_第一次按下是启动,第二次按下是停止,俵哥分享2种接线方法...
  5. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
  6. 给数据库减负的八个思路
  7. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)
  8. 【英语学习】【Daily English】U08 Dating L02 What would you do if you were me?
  9. Open3d之点云顶点法线估计
  10. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用...
  11. Combination Sum II - LeetCode
  12. MATLAB读取gdas1气象数据,HYSPLIT模式简介及单机版使用图文教程
  13. matlab图像质量评价程序,图像质量评价指标之Matlab实现
  14. 移动硬盘不在计算机显示,Win7移动硬盘在电脑上不显示怎么办?移动硬盘不显示盘符的解决办法...
  15. 多媒体一体机计算机打不开,多媒体教学一体机突然打不开PPT是怎么回事?
  16. android半透明图层颜色叠加,Android 图层混合模式PorterDuff.Mode
  17. mac 锤子android助手,Mac+Android好帮手 锤子SmartFinder
  18. 防抖和截流超级详细讲解,易懂
  19. Shader 蔓藤生长动画
  20. CVE-2020-1472NetLogon权限提升漏洞

热门文章

  1. 怎么用树莓派制作web服务器,用树莓派做web服务器,靠谱吗?
  2. 什么电脑的牌子好用_扬州诚招电动牙刷代理有什么牌子比较好用
  3. java语言实现一个长度为n_Java语言实现求解一元n次多项式的方法示例[Java代码]...
  4. C/C++中near和far的区别
  5. git 新建分支并切换到该分支_Git何谓分支
  6. mysql怎么回复.from的数据库_mysql怎么回复.from的数据库
  7. 计算机知识竞赛主持人开场词,护理竞赛主持人台词:主持人开场白台词
  8. python列表添加数字_Python-识别列表中的连续数字组
  9. mybatis配置文件加注释报错怎么办?改一笔就能帮你解决
  10. ocp证书怎么考_没有基础怎么考初级会计证书?