文章目录

  • 0 回顾
  • 1 BFS
  • 2 刷题
    • 2.1 二叉树的最小深度
      • 2.1.1 题解
      • 2.1.2 Code
      • 2.1.3 结果
    • 2.2 打开转盘锁
      • 2.2.1 题解
      • 2.2.2 Code
      • 2.2.3 结果

0 回顾

解决二叉树主要是有两种思想,分别是遍历思想以及分解思想,两种思想分别衍生出回溯算法与动态规划。二叉树除了递归遍历还有层序遍历,层序遍历即为BFS。

1 BFS

//计算从起点start到终点target的最近距离
int BFS(TreeNode* start, TreeNode* target)
{queue<TreeNode*>q;//核心数据结构//set<TreeNode*>visited;//避免走回头路vector<TreeNode*>visited;q.push(start);//起点加入队列visited.push_back(start);int step = 0;//记录扩散的步数while (!q.empty()){int sz = q.size();//将当前队列中的所有节点向四周扩散for (int i = 0; i < sz; ++i){TreeNode* cur = q.front();q.pop();if (cur == target)//判断是否到达终点return step;//将cur的相邻节点加入队列for (TreeNode* x : cur.adj()){if (!visited[x]){q.push(x);visited.push_back(x);}}}//更新步数++step;}
}

可以看出,与二叉树的层序遍历是差不多的。
二叉树的层序遍历如下:

void levelTraverse(TreeNode* root)
{if (root == nullptr) return;queue<TreeNode*> q;q.push(root);//从上到下遍历二叉树的每一层while (!q.empty()){int sz = q.size();//从左到右遍历每一层的每个节点for (int i = 0; i < sz; ++i){TreeNode* cur = q.front();q.pop();//将下一层节点放入队列if (cur->left != nullptr) q.push(cur->left);if (cur->right != nullptr) q.push(cur->right);}}
}

综上,BFS就是层序遍历的一个推广,BFS一般都是找最值的,比如说找最小,最短路径之类的,当然,BFS与DFS对比起来,消耗的空间可能大一点。

2 刷题

2.1 二叉树的最小深度



2.1.1 题解

首先要知道起点和终点是什么,起点就是根节点了,终点是最靠近根节点的叶子节点。叶子结点的判断就是if (!cur->left && !cur->right)

2.1.2 Code

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:int minDepth(TreeNode* root) {if (root == nullptr) return 0;queue<TreeNode*>q;q.push(root);//起点加入int deepth = 1;//记录深度while (!q.empty()){int size = q.size();for (int i = 0; i < size; ++i){TreeNode* cur = q.front();q.pop();if (cur->left == nullptr && cur->right == nullptr) return deepth;if (cur->left != nullptr) q.push(cur->left);if (cur->right != nullptr) q.push(cur->right);}deepth++;}return deepth;}};

2.1.3 结果

2.2 打开转盘锁

2.2.1 题解

注意看题,题目说,你需要给出解锁需要的最小旋转次数,这是一个求最值得问题,所以考虑使用BFS,但是怎么往BFS上靠呢?可以这样想,一共4个波轮,分为4位,每一位都可以往上/往下进行拨动,也就是最后有8种情况,那么这样,把最开始的0000想象成一个根节点,然后根节点分离出了8颗子树,也就是八叉树,然后就是分离出来的子树,也可以每一位往上/往下拨动波轮,这又是八叉树的延展,所以,就是一层一层的八叉树,这样,套用层序遍历也就是BFS的思想,就能搜索到我们需要的那个密码。

2.2.2 Code

class Solution {public:int openLock(vector<string>& deadends, string target) {if (target == "0000") {return 0;}unordered_set<string> dead(deadends.begin(), deadends.end());if (dead.count("0000")) {return -1;}auto num_prev = [](char x) -> char {return (x == '0' ? '9' : x - 1);};auto num_succ = [](char x) -> char {return (x == '9' ? '0' : x + 1);};// 枚举 status 通过一次旋转得到的数字auto get = [&](string& status) -> vector<string> {vector<string> ret;for (int i = 0; i < 4; ++i) {char num = status[i];status[i] = num_prev(num);ret.push_back(status);status[i] = num_succ(num);ret.push_back(status);status[i] = num;}return ret;};queue<pair<string, int>> q;q.emplace("0000", 0);unordered_set<string> seen = {"0000"};while (!q.empty()) {auto [status, step] = q.front();q.pop();for (auto&& next_status: get(status)) {if (!seen.count(next_status) && !dead.count(next_status)) {if (next_status == target) {return step + 1;}q.emplace(next_status, step + 1);seen.insert(move(next_status));}}}return -1;}
};

2.2.3 结果

「BFS广度优先搜索」相关推荐

  1. 生态伙伴 | 身边的法律人都在用的「觅律搜索」入驻飞书啦!

    法律人的日常工作中,离不开案例文书.法律法规的检索.而如何高效.便利的进行内容检索,一直困扰着法律人. 本期飞书生态伙伴「觅律搜索」是一款专门为法律人量身定制的智能法律信息检索工具.收录超过5000万 ...

  2. LeetCode-笔记-199. 二叉树的右视图——BFS广度优先搜索

    LeetCode-笔记-199. 二叉树的右视图 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,n ...

  3. PTA:7-102 喊山 (30分)---解析(bfs广度优先搜索,vector)

    7-102 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...

  4. 利用BFS广度优先搜索还原二阶魔方

    利用BFS广度优先搜索还原二阶魔方 采用BFS深度优先搜索算法进行了对于魔方求解问题的建模,并且利用C++代码进行了算法实现,能够实现输入魔方状态,自动输出解法的效果. BFS是图论中一种基本的搜索算 ...

  5. 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)

    农夫过河游戏规则:在左岸有农夫.狼.羊.菜,农夫需要想办法将狼.羊.菜最终都带到右岸,条件就是农夫不在的时候,狼会吃羊,羊会吃菜,而且每次只能带一样,或者不带. 这里会用到堆栈.队列.列表这样的数据结 ...

  6. 步步为营(十六)搜索(二)BFS 广度优先搜索

    上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...

  7. [ACM_NYOJ_21]三个水杯(BFS广度优先搜索)

    三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...

  8. 哈理工OJ 1490 咒语(BFS广度优先搜索)

    咒语 Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 162(37 users) Total Accepted: 53(35 users ...

  9. 【BFS 广度优先搜索】详解感染橘子最短时间问题

    一.题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 4 个方向 ...

最新文章

  1. android ui布局开发,Android UI设计初步(基本布局)
  2. python100个必背知识-python学习必备知识汇总
  3. 关于计算机图形标准化的论述 哪个是正确的,地大《计算机图形学(新)》在线作业 参考资料...
  4. superset在云主机上的配置
  5. Tomcat的Session管理(三)
  6. 收到朋友寄来的煎饼了
  7. android:layout_marginbottom=,Android: Retrieve layout_marginBottom programmatically?
  8. mybatis映射多对多查询实现
  9. RecyclerView.ItemDecoration 间隔线
  10. 智头条:萤石拟科创板上市将投18.5亿建厂,Matter智能家居标准延迟至明年,涂鸦、公牛、极米等企业发布
  11. 共享服务器文件溢出,文件共享锁定数溢出
  12. 安卓c语言hook,C语言hook技术实现木马功能-盗QQ密码
  13. STM32-StdPeriph函数库使用的预备知识
  14. Nokia于MWC再出手机9 PureView 6颗镜头受到瞩目
  15. 深度linux deepin15.2,从其它Deepin版本升级到深度Deepin 15.11操作系统的方法
  16. Linux命令 nslookup,每天学一个 Linux 命令(69):nslookup
  17. Android 蓝牙Wifi配网
  18. 内容创作浪潮来临时,谁能共潮而生?
  19. 到底是人的位置影响了行为呢?还是行为影响了位置?--头等舱的旅客往往是在看书
  20. AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告 (下篇)

热门文章

  1. 数据挖掘复习资料2021.12.15
  2. vant weapp在小程序自定义tabbar
  3. 手机长曝光怎么设置_挑战黑暗:怎样用手机拍出漂亮的长曝光照片?
  4. Java | 取整操作
  5. mDNS移植Android系统简介
  6. 八卦CSDN博客排名
  7. MATLAB神经网络的汉字字符数字字母的识别
  8. java 枚举值如何比较
  9. 【转载】二十条职业谏言
  10. 整理了27个Python人工智能库,建议收藏