leetcode算法总结 —— BFS广度优先搜索

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);
        }
    }
    1. 二叉树的层序遍历(dfs和bfs)
    1. 二叉树的层次遍历II(reverse)
    1. 二叉树的锯齿形层次遍历(设置flag)
    1. 二叉树的最大深度
    1. 二叉树的最小深度(加条件,判断当前节点是否为叶子节点)
    1. 填充每个节点的下一个右侧节点指针(每层判断)(或DFS前序遍历)
    1. 填充每个节点的下一个右侧节点指针II
    1. 二叉树的右视图(每层最后一个元素)
    1. 在每个树行中找最大值
    1. 找树左下角的值(每次更新一行的最左值)
    1. 二叉树的层平均值
    1. N叉树的层序遍历(判断当前节点子节点非空则把子节点全部存入队列)
    1. N叉树的最大深度
    1. 在二叉树中增加一行(重在判断当前行节点的下一行为需要增加的行)

现实转换二叉树进行BFS

    1. 员工的重要性
    1. 杀死进程

无向连通图

树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树

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. 省份数量

有向图

我们需要两个数据结构:
1、邻接表:通过结点的索引,我们能够得到这个结点的子结点。
2、入度数组:通过结点的索引,我们能够得到该课的前置课程数,也就是父节点个数。

    1. 课程表I (课程表II,完全相同)

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/114108562