左神算法基础class6—题目2宽度优先遍历和深度优先遍历

  • 1.题目:宽度优先遍历和深度优先遍历
  • 2.宽度优先遍历
    • (1)分析
    • (2)核心代码
  • 3.深度优先遍历
    • (1)分析
    • (2)核心代码
  • 4.完整代码

1.题目:宽度优先遍历和深度优先遍历

2.宽度优先遍历

(1)分析

宽度优先遍历指从头节点开始,按照与当前节点步数越近越先输出的原则,遍历所有节点

如果从1开始,最先遍历离1最近的2,3,4,接着再是7,5,6。同一批次2,3,4或者7,5,6内部输出顺序不做要求。3节点遍历后7节点依旧指向3为了避免重复遍历,使用unordered_set结构判断是否遍历过。
具体过程如下;
①利用队列实现 ;
②从源节点开始依次按照宽度进队列,然后弹出 ;
③每弹出一个点,把该节点所有没有进过队列的邻接点放入队列;
④直到队列变空;

(2)核心代码

void bfs(Node* nodes)
{if(nodes == NULL)    return ;    //空节点直接返回 queue<Node*> q;unordered_set<Node*> set;      //用于判断是否遍历过 q.push(nodes);set.insert(nodes);while(!q.empty()){Node* help = q.front();cout<<help->value<<" ";q.pop();//把队头指向的所有未遍历节点加入队列和set for(Node* t: help->nexts)  {if(set.find(t) == set.end()) //未在set中{q.push(t);set.insert(t);}}}
}

3.深度优先遍历

(1)分析

深度优先遍历是一条路走完再走另一条。

具体过程如下:
①利用栈实现 ;
②从源节点开始把节点按照深度放入栈,然后弹出 ;
③每弹出一个点,若该节点有没有进过栈的邻接点存在,把该节点和没有进过栈的一个邻接点放入栈 ;
④直到栈变空;

对于上述的图,每一步的栈和set容器如下:
栈:1
set:1
栈:空
set:1
栈:1,2
set:1,2
栈:1,2,7
set:1,2,7
栈:1,2,7,3,
set:1,2,7,3
栈:1,2,7,3,5
set:1,2,7,3,5
栈:1,2,7,3
set:1,2,7,3,5
栈:1,2,7
set:1,2,7,3,5
栈:1,2
set:1,2,7,3,5
栈:1
set:1,2,7,3,5
栈:1,4
set:1,2,7,3,5,4
栈:1,4,6
set:1,2,7,3,5,4,6
栈:1,4
set:1,2,7,3,5,4,6
栈:1,
set栈:空
set:1,2,7,3,5,4,6

(2)核心代码

void dfs(Node* node)
{if(node == NULL) return;stack<Node*> s;unordered_set<Node*> set;s.push(node); set.insert(node);cout<<node->value<<" ";              //第一个元素直接输出 while(!s.empty()){Node* help = s.top();s.pop();for(auto tmp : help->nexts){if(set.find(tmp) == set.end()) //未遍历 {s.push(help);                s.push(tmp);set.insert(tmp);cout<<tmp->value<< " ";break;                      //一次只找一个 }} }
}

4.完整代码

#include <iostream>
#include<unordered_map>
#include<unordered_set>
#include<list>
#include<vector>
#include<queue>
#include<stack>
#include"Node.h"
#include"Edge.h"
#include"Graph.h"
#include"GraphGenerator.h"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */void dfs(Node* node)
{if(node == NULL) return;stack<Node*> s;unordered_set<Node*> set;s.push(node); set.insert(node);cout<<node->value<<" ";              //第一个元素直接输出 while(!s.empty()){Node* help = s.top();s.pop();for(auto tmp : help->nexts){if(set.find(tmp) == set.end()) //未遍历 {s.push(help);                s.push(tmp);set.insert(tmp);cout<<tmp->value<< " ";break;                      //一次只找一个 }} }
} void bfs(Node* node)
{if(node == NULL) return ;    //空节点直接返回 queue<Node*> q;unordered_set<Node*> set;      //用于判断是否遍历过 q.push(node);set.insert(node);while(!q.empty()){Node* help = q.front();cout<<help->value<<" ";q.pop();//把队头指向的所有未遍历节点加入队列和set for(Node* t: help->nexts)    {if(set.find(t) == set.end()) //未在set中{q.push(t);set.insert(t);}}}
} int main(int argc, char** argv) {GraphGenerator g;vector<vector<int> > matrix= {{12,1,2},{13,1,3},{14,1,4},{9,2,7},{10,7,3},{8,3,5},{10,4,6}};Graph graph = g.createGraph(matrix);//test :某节点所指向的节点 cout<<"1所指向:";Node* testnode = graph.nodes[1];for(auto n : testnode->nexts)cout<< n->value<<"、";//test :输出所有节点与边      cout<<endl<<"-----------------------------------------------"<<endl ;cout<<"所有节点为: "<<endl ; unordered_map<int,Node*>::iterator ite1 = graph.nodes.begin();while(ite1 != graph.nodes.end()){cout << "节点: "<<(ite1)->second->value<<"、";//cout << "节点: "<<(ite1)->first<<"、";ite1++;}cout<<endl<<"-----------------------------------------------"<<endl ;cout<<"节点与边为: "<<endl ;unordered_set<Edge*>::iterator ite = graph.edges.begin();while(ite != graph.edges.end()){cout << "边权为 "<<(*ite)->weight<<"    ";cout<<(*ite)->from->value <<"---->"<<(*ite)->to->value<<endl; ite++;}Node *node = graph.nodes[1];cout<<endl<<"-----------------------------------------------"<<endl ;cout<<"宽度优先遍历bfs: "<<endl;bfs(node);cout<<endl<<"-----------------------------------------------"<<endl ;cout<<"深度优先遍历dfs: "<<endl;dfs(node);return 0;
}

注:Graph.h等头文件在上一篇图的存储与表达中。

左神算法基础class6—题目2宽度优先遍历和深度优先遍历相关推荐

  1. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

    Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...

  2. java取余数的函数_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  3. igs无法分配驱动器映射表_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  4. 左神算法基础班3_13深度拷贝含有随机指针的链表

    Problem: 复制含有随机指针节点的链表 [题目] 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; ...

  5. 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)

    package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...

  6. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

  7. 左神算法(一)下修改版

    序言: 此篇内容紧跟在左神算法(一)上修改版之后. 左神算法(一)上修改版 左神算法(一)下修改版 左神算法(二) 七.二叉树的基本算法 1.二叉树 2.二叉树的先序.中序.后序遍历 先序:任何子树的 ...

  8. 左神算法中级班第三课[C++代码]

    左神算法中级班第三课[C++代码] 第一题:流水线打包问题[阿里原题] 代码 第二题 代码 第三题:打印螺旋矩阵 代码 第四题 代码 第五题:判读aim是否在矩阵中 代码 第七题:topK问题 代码 ...

  9. 【搞定左神算法初级班】第4节:二叉树及相关常见面试题

    目 录: 题目1:实现二叉树的先序.中序.后序遍历[递归方式和非递归方式] 题目2:在二叉树中找到一个节点的后继节点 题目3:介绍二叉树的序列化和反序列化 题目4:折纸问题 题目5:判断一棵二叉树是否 ...

  10. 左神算法初级班笔记4:二叉树

    文章目录 01 | 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归 方式 1.递归版本: 2. 非递归版本: 02 | 在二叉树中找到一个节点的后继节点 03 | 介绍二叉树的序列化和反序列化 ...

最新文章

  1. 开启基于Query的实例分割新思路!腾讯华科提出QueryInst
  2. 大数据互联网架构 tomcat集群配置时三个端口的作用
  3. 如果人民币贬值,对股市会有什么影响?
  4. 简而不漏,300字Java标识符命名规则规范,看一遍就可以记住,包名类名变量名常量名,让命名有迹可循
  5. cdh mysql sqoop 驱动_大数据技术之Sqoop学习——原理、安装、使用案例、常用命令...
  6. 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?
  7. Objective-C的Runtime System
  8. 机翻测评 | 友商翻译 VS 火山翻译-中译英语向
  9. 创建5个组,然后把30个用户分别加入到5个组中
  10. python转bat_bat 转换为python
  11. 关闭appleid双重认证_iPhone 丢失怎么办?开启双重认证就能解决!
  12. Innoreader + Rsshub
  13. 2020-11-16学习总结: sass配置
  14. kangle安装php7.0_搭建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
  15. 分析Faster RCNN中的RPN
  16. (私人收藏)64个精致的页面loadinggif动画
  17. mac下hadoop环境的搭建以及碰到的坑点
  18. html5诊断报告,网站诊断报告(模板).doc
  19. matlab在sin处出现解析错误,破除“解析包时出现错误”方法大全,全部都在这了!...
  20. python好玩的黑科技_用Python玩微信跳一跳黑科技详细使用教程

热门文章

  1. OkHttp3源码详解(四)缓存策略,万分膜拜
  2. springboot系列(5) -- 整合 logback 彩色日志输
  3. 重度抑郁症患者的脑龄
  4. 加个ing是什么意思_ing是什么意思?
  5. 打气球游戏——Burst Balloons
  6. crx什么意思_CRX文件是什么
  7. 奇迹 与服务器连接中断,奇迹少女连接服务器失败 连接不上网络怎么办
  8. tween.js简介
  9. 大文件异步分片上传到Seaweed服务器
  10. python使用pywinauto驱动微信客户端实现公众号爬虫