广度优先搜索(Breadth First Search)
用途
BFS在算法中有广泛的应用,尤其是图算法中。此外很多问题可以抽象为图,比如树,迷宫地图等等
典型应用:最短路径,层序遍历
广度优先搜索的运行时间是图的邻接表大小的一个线性函数
O(V+E)
过程原理
- 广度优先遍历,将图中所有顶点逐一拉入队列。每次在队头操作,将离源顶点/当前顶点间隔只有一步(距离最近)且未被发现的节点放入队尾中;然后当前顶点出队,对下一个队头操作。
- 其中需要在遍历过程中给每个顶点颜色属性,表示未发现,发现,操作完三种状态;
- 还需要一个距离属性可以记录该节点到源节点的距离,该距离即为最短距离
- 如果涉及到路径回溯,那么每个节点还需要记录父节点
树的层序遍历输出
例如二叉树 {3,9,20,#,#,15,7},
将每层节点作为一个向量,存到数组: [ [3] , [9, 20] , [15, 7] ]
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<vector<int> > levelOrder(TreeNode* root)
{
vector<vector<int> > res;
if(!root)
return res;
queue<TreeNode*> myque;
myque.push(root);
while(myque.size())
{
vector<int> rec;
//record the length of every level
int len = myque.size();
for(int i=0; i<len; ++i)
{
rec.push_back(myque.front()->val);
if(myque.front()->left)
myque.push(myque.front()->left);
if(myque.front()->right)
myque.push(myque.front()->right);
myque.pop();
}
res.push_back(rec);
}
return res;
}