左神算法基础class6—题目2宽度优先遍历和深度优先遍历
左神算法基础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宽度优先遍历和深度优先遍历相关推荐
- 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点
Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...
- java取余数的函数_左神算法基础:哈希函数和哈希表
笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...
- igs无法分配驱动器映射表_左神算法基础:哈希函数和哈希表
笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...
- 左神算法基础班3_13深度拷贝含有随机指针的链表
Problem: 复制含有随机指针节点的链表 [题目] 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; ...
- 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)
package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...
- 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)
package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...
- 左神算法(一)下修改版
序言: 此篇内容紧跟在左神算法(一)上修改版之后. 左神算法(一)上修改版 左神算法(一)下修改版 左神算法(二) 七.二叉树的基本算法 1.二叉树 2.二叉树的先序.中序.后序遍历 先序:任何子树的 ...
- 左神算法中级班第三课[C++代码]
左神算法中级班第三课[C++代码] 第一题:流水线打包问题[阿里原题] 代码 第二题 代码 第三题:打印螺旋矩阵 代码 第四题 代码 第五题:判读aim是否在矩阵中 代码 第七题:topK问题 代码 ...
- 【搞定左神算法初级班】第4节:二叉树及相关常见面试题
目 录: 题目1:实现二叉树的先序.中序.后序遍历[递归方式和非递归方式] 题目2:在二叉树中找到一个节点的后继节点 题目3:介绍二叉树的序列化和反序列化 题目4:折纸问题 题目5:判断一棵二叉树是否 ...
- 左神算法初级班笔记4:二叉树
文章目录 01 | 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归 方式 1.递归版本: 2. 非递归版本: 02 | 在二叉树中找到一个节点的后继节点 03 | 介绍二叉树的序列化和反序列化 ...
最新文章
- 开启基于Query的实例分割新思路!腾讯华科提出QueryInst
- 大数据互联网架构 tomcat集群配置时三个端口的作用
- 如果人民币贬值,对股市会有什么影响?
- 简而不漏,300字Java标识符命名规则规范,看一遍就可以记住,包名类名变量名常量名,让命名有迹可循
- cdh mysql sqoop 驱动_大数据技术之Sqoop学习——原理、安装、使用案例、常用命令...
- 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?
- Objective-C的Runtime System
- 机翻测评 | 友商翻译 VS 火山翻译-中译英语向
- 创建5个组,然后把30个用户分别加入到5个组中
- python转bat_bat 转换为python
- 关闭appleid双重认证_iPhone 丢失怎么办?开启双重认证就能解决!
- Innoreader + Rsshub
- 2020-11-16学习总结: sass配置
- kangle安装php7.0_搭建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
- 分析Faster RCNN中的RPN
- (私人收藏)64个精致的页面loadinggif动画
- mac下hadoop环境的搭建以及碰到的坑点
- html5诊断报告,网站诊断报告(模板).doc
- matlab在sin处出现解析错误,破除“解析包时出现错误”方法大全,全部都在这了!...
- python好玩的黑科技_用Python玩微信跳一跳黑科技详细使用教程