转载自: https://blog.csdn.net/u011613367/article/details/50950408
数据结构中的有两个比较重要的算法。深度优先搜索和广度优先搜索。
二叉树中的深度搜索就是对一个分支进行遍历,而广搜就是一层一层的搜索。
下面通过代码进行讲解:

#include <iostream>
#include <queue>
using namespace std;
struct Node
{Node *Left;int Value;Node *Right;Node(int value=0, Node *left=NULL, Node *right=NULL):Value(value) , Left(left), Right(right) {};};
Node *node[11];void  creat();
void DFS(Node*);
void BFS(Node*);int main()
{creat();Node* Root = node[10];cout<<"深搜结果为:"<<endl;DFS(Root);cout<<endl<<"广搜结果为:"<<endl;BFS(Root);return 0;
}void creat()
{node[1]=new Node(1);node[2]=new Node(2);node[3]=new Node(3);node[4]=new Node(4);node[5]=new Node(5, node[1], node[2]);node[6]=new Node(6, node[3], node[4]);node[7]=new Node(7);node[8]=new Node(8,node[5],node[6]);node[9]=new Node(9,node[7]);node[10]=new Node(10,node[8],node[9]);
}void DFS(Node* Root)
{cout<<Root->Value<<" ";if (Root->Left!=NULL)DFS(Root->Left);if (Root->Right!=NULL)DFS(Root->Right);return;
}void BFS(Node *Root)
{queue<Node*> Q;Node * node ;Q.push(Root);while(!Q.empty()){node = Q.front();cout<<node->Value<<" ";if (node->Left!=NULL){Q.push(node->Left);}if (node->Right!=NULL){Q.push(node->Right);}Q.pop();}cout<<endl;
}

注意:其实这代码是不好的,主要是我为了让main函数看着简单一些把创建二叉树的函数写在main函数外面,不过不影响大家理解
首先要创建一棵二叉树主要用了构造函数知识,我想大家既然来看二叉树了,C++至少应该学了一些了(排除一些编程天才。。。)
假设大家已经看懂了二叉树的构造,下面就是作者构造的二叉树

程序运行结果

我们来讲解今天的主题之深搜 先来看看深搜
深搜:10 8 5 1 2 6 3 4 9 7
广搜:10 8 9 5 6 7 1 2 3 4
大家对照着图结合开头的几句话来具体感受到底什么是深搜,什么是广搜。
个人认为必须要对广搜和深搜之间的区别和这两种算法的遍历顺序有一个概念,这样看起代码来应该会很容易,大家可以结合我的gdb调试那篇文章来理解深搜。
不要嫌我啰嗦,说这么一大堆是想让大家更好的理解代码,如果上面的过程大家认真做了话,看懂代码是很容易的
深搜

void DFS(Node* Root)
{cout<<Root->Value<<" ";if (Root->Left!=NULL)DFS(Root->Left);if (Root->Right!=NULL)DFS(Root->Right);return;
}

PS:请准备草稿纸,笔,在读的时候画一个栈图,极其有帮助

首先main函数入栈,接着DFS函数入栈(参数为node10),显然输出10,接着判断左边的node8,发现满足第一个if,于是DFS函数(node8)又进栈了,于是输出8,又满足第一个if,于是DFS函数(node5)又入栈啦,输出5,又满足第一个if,于是DFS函数(node1)又入栈啦,输出1,额,这次node1的left可不满足第一个if,right也不满足第二个if,啊哦,dfs(node1)就出栈了,于是栈顶变为dfs(node5),刚才dfs(node5)只执行了第一个if便被dfs(node1)压住了,现在终于解脱了,开始判断是否满足第二个if,显然满足,于是dfs(node2)又进栈了,dfs(node5)又被压住了(人家可是还有return没有执行呢,好悲催)。。。 node2进栈后输出2,又开始进行两个if的判断,显然不满足,于是return出栈了。啊啊啊,dfs(node5)终于可以return出栈了。
啊啊啊,想在终于轮到我dfs(node8)的天下了,终于可以开始判断第二个if了,第二个if满足,呃呃呃,dfs(node6)又入栈了。。。dfs(node8)又被压住了(return还没有执行呢)。
过程就是这样,不断地出栈入栈直到最终dfs(node10)出栈。这时候栈里只剩下main函数了(后面详细的进栈入栈过程希望大家可以丝毫不差的推出来,千万不能似懂非懂,模棱两可)

bfs

void BFS(Node *Root)
{queue<Node*> Q;Node * node ;Q.push(Root);while(!Q.empty()){node = Q.front();cout<<node->Value<<" ";if (node->Left!=NULL){Q.push(node->Left);}if (node->Right!=NULL){Q.push(node->Right);}Q.pop();}cout<<endl;
}

bfs主要是用队列来实现的,如果把栈比作死胡同的话,那么队列就是一条很窄的单行道

规则是先进先出首先把让node10入队,然后来一个while循环(不得不说程序设计中经常用while循环)只要这个队列不为空,我就循环。
现在进入单行道了(入队了)迎面驶来的的node10,显然先输10,然后执行两个if判断,全部成立,于是node8和node9又入队了
现在队中情况
node10 <- node8<- node9
然后node10驶出了单行道(q.pop();)于是迎面驶来node8,输出8,然后滴滴,node5和node6又进入单行道了现在队中情况
node8<-node9<-node5<-node6
然后node8驶出了单行道(q.pop();)
就这样不断地驶入和驶出,最终完成遍历;

好啦,二叉树就给大家讲解到这里了,如果哪儿又不理解或者我的讲解有错误的地方,欢迎在评论中告知,我会第一时间回复的。

二叉树的深搜(DFS)与广搜(BFS)相关推荐

  1. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  2. 深搜(DFS) 广搜(BFS)

    搜索的核心概念 问题求解树 是一种思维逻辑层面的结构,而非程序中的实际存储结构:思维结构可以表示无限的概念 设计搜索算法的核心关键点 设计问题求解树的状态 搜索剪枝和优化 在问题求解树搜索过程中,对于 ...

  3. 算法学习 (门徒计划)3-3 深搜(DFS)与广搜(BFS)及经典问题 学习笔记

    算法学习 (门徒计划)3-3 深搜(DFS)与广搜(BFS)及经典问题 学习笔记 前言 深搜与广搜 搜索的核心概念 问题求解树 搜索剪枝和优化 问题求解树的状态 对比深搜与广搜 DFS-深度(deep ...

  4. 深搜和广搜(初学者)

    搜索入门 最近对搜索有了一点浅显的了解,想跟大家分享分享. 说起来我也是初学者,恰巧有些自己的理解,想起来自己开始学习搜索的情况,真是一把鼻子一把泪啊.所以想把我领悟的过程,看到的一些基础的我觉得好的 ...

  5. 广搜(bfs)模板太好用了!bfs详细讲解--超详细题目分析(持续更新题目----)【算法分享】

    广搜讲解目录 广搜回顾 广搜题目 noj1541八数码问题 题目描述: 题目要求即样例 题目分析 题解代码[注解详细]---理解BFS noj1652 僵尸来了 题目描述 题目要求及样例 题目分析 题 ...

  6. poj 1426 栈 广搜

    题目意思很简单 : 就是找一个十进制的数,全由 1 0 组成,是输入那个数字的整数倍 答案有很多种,所以是special judge 需要用到 : 同余取模定理 广搜 因为是广搜我们就可以用栈 当然也 ...

  7. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

  8. 算法——广搜(BFS)/深搜(DFS)

        在图的基本算法中,最初接触的就是图的遍历算法,根据访问节点的顺序,可分为广度优先搜索(BFS)和深度优先搜索(DFS). 广度优先搜索 广度优先搜索算法主要解决两个问题: 从节点A出发有到节点 ...

  9. 深搜DFS\广搜BFS 图初步入门

    首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题. 深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断 ...

最新文章

  1. 博为峰JavaEE技术文章 —— Hibernate 指南(3)Hbm文件
  2. 简析正则表达式的使用
  3. 协同滤波模型的推荐算法(ACM暑校-案例学习)
  4. php插入成功数据不显示,PHP插入数据不成功,什么原因呢?
  5. 场景感知:CNN方法对三维重建/slam/实时定位的一些Base改进
  6. ros重置后地址_从零开始丨INDEMIND双目惯性模组ROS平台下实时ORB-SLAM记录教程
  7. 【Python】提升Python程序性能的好习惯2
  8. 实时数据处理环境搭建flume+kafka+storm:4.storm安装配置
  9. selenium元素定位——下拉选择框
  10. vue 二级三级路由配置
  11. 每秒浮点运算次数FLOPS
  12. Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
  13. Matlab识别拨号音,电话拨号音识别全解.ppt
  14. python rfm 细分_Python中的客户细分
  15. 并查集应用-判断亲戚关系
  16. Python爬虫学习之数据提取(Beautiful Soup)
  17. 马克思主义哲学笔记(二)
  18. QGIS加载天地图、高德地图
  19. 拓嘉辰丰:拼多多详情图制作方法
  20. 英文论文中可以借鉴的好词好句

热门文章

  1. Python添加邮件附件并通过邮件发送测试报告
  2. Django 序列化三种方式 对象 列表 元组
  3. 浅谈linux命令大全
  4. 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:
  5. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口
  6. powerdesigner 生成数据库脚本
  7. Mantis使用说明
  8. 数据库行转列的sql语句(zt)
  9. ZZ:Business Analysis Career Path
  10. 蓝牙BLE ATT剖析(一)