题目:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如: 给定二叉树: [3,9,20,null,null,15,7], 返回其层次遍历结果:
提示: 节点总数 <= 1000
这道题与上题层次遍历的题解题思路上大体是相同的,核心都是借助队列来完成层序遍历,主要区别是上一题遍历完之后是保存在一维数组中返回,而本题是将每一行保存在一个一维数组中,然后返回的是一个二维数组。所以我们可以在上一题的基础上引入两个计数变量,分别为cur_num记录当前层元素个数,next_num记录下一层元素个数。 算法流程如下: 当我们每向一维数组里添插入一个当前层的元素时,我们就让cur_num减1,同时我们在当前层每向队列加入元素时就将next_num加1;当 cur_num 减为 0 时,说明当前层元素全都加入到一维数组,此时我们就将这个一维数组加入到二维数组中,以此类推,我们最终返回一个二维数组。
代码如下:
class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { if(root==NULL) return vector<vector<int>>(); vector<vector<int>> res; vector<int> v; queue<TreeNode*>q; //cur_num记录当前层元素个数,next_num记录下一层元素个数 int cur_num=1,next_num=0; q.push(root); while(!q.empty()) { TreeNode* tem=q.front(); v.push_back(tem->val); q.pop(); //将当前层元素压入一维数组中后减1 cur_num--; if(tem->left) { //如果左节点不为空,则入队,并将下层元素个数加1 q.push(tem->left); next_num++; } if(tem->right) { //如果右节点不为空,则入队,并将下层元素个数加1 q.push(tem->right); next_num++; } if(cur_num==0) { //若当前层元素个数为0,则将维位数组插入到二维数组中 res.push_back(v); //清空一维数组,用来存下一层元素 v.clear(); //将下一层元素个数赋予当前层 cur_num=next_num; //下一层元素个数清零,用来记录下下层元素个数 next_num=0; } } return res; } }; 执行用时:4 ms, 在所有 C++ 提交中击败了90.68%的用户 内存消耗:12.3 MB, 在所有 C++ 提交中击败了71.85%的用户