题目:二叉树的层序遍历

使用的是队列与深度优先搜索

函数返回值为二维数组,因此需要使用多个一维数组将每一层的值存起来,而使用队列可以实现单独存储每一层的效果(FIFO)

首先判断根节点是否为空,不为空则直接入队

定义两个循环,外层循环用于记录每一层所有的值(相对于整棵树进行),内层循环用于将单层内的所有值一个一个的压入用于临时存储的vec中(相对于单层进行)

通过size,可以知道每一层需要弹出的元素的数量,从而得知哪些元素是同一层的

注:性能优化:

1.提前将队列的首元素存储起来,避免后续对.front()函数的多次调用

2.使用std::move()可以避免不必要的拷贝(因为vec被来就是外层循环的局部变量,当res的push操作被执行时,也就意味着这一层的循环终止了)

 1vector<vector<int>> levelOrder(TreeNode* root)
 2{
 3    std::queue<TreeNode*> que;
 4    std::vector<std::vector<int>> res;
 5    if(root) que.push(root);
 6    while(!que.empty())
 7    {
 8        int size = que.size();
 9        std::vector<int> vec;
10        vec.reserve(size);
11        while(size)
12        {
13            TreeNode* curr = que.front();
14            que.pop();
15
16            vec.push_back(curr->val);
17            if(curr->left) que.push(curr->left);
18            if(curr->right) que.push(curr->right);
19            size--;
20        }
21        res.push_back(std::move(vec));
22    }
23    return res;
24}