层序遍历就是逐层遍历树结构。
广度优先搜索是一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。 该算法从一个根节点开始,首先访问节点本身。 然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。
当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。,说简单点就是一层遍历完遍历下一层。
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。
需要借用一个辅助数据结构队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
解题思路:先入队一个节点,然后把这个节点的数据取出放入临时数组中,如果这个结点有左孩子那就把左孩子入队,头孩子同理,下面大家看看图就明白了
1:首先我们把头节点入队,此时队列的size为1。
2.获取队列头部的结点,把这个结点的val添加进临时数组中,然后出队,因为这个结点既有左孩子也有右孩子,所以把左右孩子均入队,入队后size变为了2,如下图
3.还是老样子,获取队头结点,把该节点的数据存放到临时数组,然后出队,判断2这个结点有没有左右孩子,有的话入队,因为没有所以不做操作。
4.现在应该知道我要做什么了,还是获取队头的结点,把该节点的数据存放到临时数组,然后出队,判断3这个结点的左右孩子情况,把左右孩子均放入队列。
5.依次获取队头结点,将每个结点对应的val放入临时数组,然后出队,判断后均无左右孩子所以不执行入队。队列为空结束。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL)
{
return res;
}
queue<TreeNode*> a;
a.push(root);//放入根节点
while(!a.empty())
{
vector<int> tmp;//临时数组
int len=a.size();
for(int i=0;i<len;i++)
{
TreeNode*tmpnode=a.front();//把队列的头部拿出来
a.pop();//出队
tmp.push_back(tmpnode->val);//放入临时数组
if(tmpnode->left)//如果该结点有左孩子那就放入队列
{
a.push(tmpnode->left);//入队
}
if(tmpnode->right)//如果存在右孩子,那就还是入队
{
a.push(tmpnode->right);//入队
}
}
res.push_back(tmp);//把临时数组的数据添加到二维数组
}
return res;
}
};