题目:二叉树的层序遍历
使用的是队列与深度优先搜索
函数返回值为二维数组,因此需要使用多个一维数组将每一层的值存起来,而使用队列可以实现单独存储每一层的效果(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}