通过这道题目,学会了BFS。
其实BFS的概念很简单,之前在看书的时候也接触到过,并且树的层序遍历就是用的queue,这里简单总结一下。
首先,从BFS的定义出发,显然是要用到队列的。因为BFS有一个显著的概念就是分层,必须遍历完本层之后,再去遍历下一层。如果不要求区分每一层的话,那么实际上一个队列就能完成。就像经典的树的层序遍历一样,上层的元素肯定首先放入到队列中,下层的元素一定都在上一层元素遍历完之后,才会被遍历。
但是,如果我们要考虑层数,也就是需要知道当前元素是在第几层的时候,我们必须用到两个队列。基本思路和上面方法差不多,首先将元素放入q1中,然后对q1中的元素出队列,将其左右子树(如果有的话)放入q2中。当q1遍历完毕之后,说明本层已经遍历完毕了,那么就交换q1和q2,继续遍历新的q1(也就是原来的q2),最终,当两个队列都为空(实际上也就是最后交换完毕之后的q1为空)的时候,整个树就都遍历完毕了。
那么我们怎样才能够知道当前的层数呢?实际上,每次交换q1和q2的时候,我们一定是遍历完当前层,所以层数会加1。
class Solution
{
public:
vector<vector<int> > levelOrder(TreeNode *root)
{
vector<int> level;
vector<vector<int> > ret;
if (root == NULL)
return ret;
queue<TreeNode*> qPush, qPop;
qPop.push(root);
while (!qPop.empty())
{
while (!qPop.empty())
{
TreeNode* temp = qPop.front();
qPop.pop();
level.push_back(temp->val);
if (temp->left)
qPush.push(temp->left);
if (temp->right)
qPush.push(temp->right);
}
if (!level.empty())
ret.push_back(level);
level.clear();
swap(qPush, qPop);
}
return ret;
}
};