102. 二叉树的层序遍历 - 力扣(LeetCode)
解题思路:
例如:
1.因为题目返回值是一个二维的vector,即我们知道了要有一个vector<vector<int>> vv 用来存放我们的答案;
2.说到层序,就会想到创建一个队列queue<TreeNode*> que 依层序依次存放各个节点,根据先进先出的特性,依次取队列头获取节点实现层序遍历;
3.但是本题的矛盾点是,如何将这些节点数据都能存放到自己的层级上。因为正常的遍历都是一个一个的取队头,不知道取到第几个这一层才算取完了
那么我们可以想到可以记录一下这一层有几个嘛,但是如何记录呢?
我们可以想一下我们的队列是如何存放数据的
(1)需要通过while(!que.empty()) 循环来取出节点,那么我们得先将头节点root手动push进que:
(2)那么按照要求,这个7是不是就是第一层的全部数据?而且此时我们的que.size()是不是就是当前顶层的节点个数?(之后的层级是不是也会有这样的规律?)那么我们先将这层数据存入我们的vector<vector<int>> vv ? 那么还需要创建一个vector<int> v 来存放单层的数据;再将v存入vv中。
将que.front()取出来
TreeNode* front = que.front();
que.pop(); v.push_back(front->val);
(3)在拿到front的同时,我们要将其下的子节点都入队列
if (front->left) { que.push(front->left); } if (front->right) { que.push(front->right); }那么此时我们再观察
此时que.size()是不是就是第二层的节点个数?那么我们可以通过一个while(que.size())循环来控制每批从队列里取多少节点:
while (队列非空) {
初始化层级v;
while(level_size量--) {
取队头;队列pop();入数据val 进v.push_back();
将此节点的子节点入队que.push(子节点);
}
这一批(即这一层)的val都进v了,那么就要将vv.push_back(v)了;
此时还要更新level_size = que.size();
}
最后总结:
本题的要点是知道每一层要取几个节点,通过每取完一层后,记录此时留在队列中的元素个数,即为下一层要取的节点个数。
完整代码:
vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> vv; queue<TreeNode*> que; int level_size = 0; if (root) { que.push(root); level_size = 1; } while (!que.empty()) { vector<int> v; while (level_size--) { TreeNode* front = que.front(); que.pop(); v.push_back(front->val); if (front->left) { que.push(front->left); } if (front->right) { que.push(front->right); } } vv.push_back(v); level_size = que.size(); } return vv; }