文章目录
BFS
模版
queue<TreeNode *> q;
q.push(root);
while (!q.empty()) //这里处理队列
{
int qSize = q.size();
//循环处理该层每个节点,如果需要区分每个层则需要加该for循环
for (int i = 0; i < qSize; i++) {
TreeNode *tempNode = q.front();//取节点
q.pop();//弹节点
vTemp.push_back(tempNode->val); //处理当前节点
//将该节点的子节点都入列,如果是多叉树则将该节点所有子节点都入列
if (tempNode->left != nullptr) q.push(tempNode->left);
if (tempNode->right != nullptr) q.push(tempNode->right);
}
}
-
- 二叉树的层序遍历(dfs和bfs)
-
- 二叉树的层次遍历II(reverse)
-
- 二叉树的锯齿形层次遍历(设置flag)
-
- 二叉树的最大深度
-
- 二叉树的最小深度(加条件,判断当前节点是否为叶子节点)
-
- 填充每个节点的下一个右侧节点指针(每层判断)(或DFS前序遍历)
-
- 填充每个节点的下一个右侧节点指针II
-
- 二叉树的右视图(每层最后一个元素)
-
- 在每个树行中找最大值
-
- 找树左下角的值(每次更新一行的最左值)
-
- 二叉树的层平均值
-
- N叉树的层序遍历(判断当前节点子节点非空则把子节点全部存入队列)
-
- N叉树的最大深度
-
- 在二叉树中增加一行(重在判断当前行节点的下一行为需要增加的行)
现实转换二叉树进行BFS
-
- 员工的重要性
-
- 杀死进程
无向连通图
树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int provinceCount = 0;
int cityCount = M.size();
vector<bool> vVisited(cityCount);
queue<int> q;
//遍历每一个城市
for(int i = 0; i < cityCount; i++) {
//对每个城市进行BFS
q.push(i);
//该城市如果没访问过则对该城市进行BFS
if(!vVisited[i]) {
while(!q.empty()) {
int j = q.front();
q.pop();
vVisited[j] = true;//该城市设为访问过
//这里不需要区分每一层,所以不需要加for循环
//将与该城市相连的城市放入队列,也就是该节点的所有连通城市都放入队列
for(int k = 0; k < cityCount; k++) {
//如果是连通,并且没访问过则放入队列,如果访问过了,就不需要管了
if(!vVisited[k] && M[j][k] == 1) {
q.push(k);
}
}
}
//这一套下来就找到了一个节点的所有连通节点,这时我们省份数量加一
provinceCount++;
}
}
return provinceCount;
}
};
-
- 省份数量
有向图
我们需要两个数据结构:
1、邻接表:通过结点的索引,我们能够得到这个结点的子结点。
2、入度数组:通过结点的索引,我们能够得到该课的前置课程数,也就是父节点个数。
-
- 课程表I (课程表II,完全相同)