题目描述
题目链接103. 二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间瓜代进行)。
示例 1:
- <strong>输入:</strong>root = [3,9,20,null,null,15,7]
- <strong>输出:</strong>[[3],[20,9],[15,7]]
复制代码 示例 2:
- <strong>输入:</strong>root = [1]
- <strong>输出:</strong>[[1]]
复制代码 示例 3:
- <strong>输入:</strong>root = []
- <strong>输出:</strong>[]
复制代码 提示:
- 树中节点数量在范围 [0, 2000] 内
- -100 <= Node.val <= 100
思路解析
与层序遍历雷同,值必要在偶数层将所取出的val值数组反转再存入答案数组中
利用一个队列进行每层的节点存储,当队列中有元素时,遍历该队列,取出val值并将该节点的左右子节点放入队列,末了弹出该节点
必要注意的是,在遍历队列的时候,判断语句不能是队列的empty函数。由于每个元素还会放入子节点,以是在遍历前应当创建一个int变量进行存当前队列巨细,再用队列巨细进行遍历
代码实现
- class Solution {
- public:
- vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
- if(root==nullptr)return {};
- int cnt = 1;//层数
- vector<vector<int>>ans;
- queue<TreeNode*>que;//记录每一层的节点
- que.push(root);//第一层节点
- while(que.size()){//当该层还有元素则进入循环
- vector<int>vec;//记录该层节点的val值
- int n=que.size();
- while(n--){//取出val值,从左至右放入下一层元素
- vec.push_back(que.front()->val);
- if(que.front()->left)que.push(que.front()->left);
- if(que.front()->right)que.push(que.front()->right);
- que.pop();
- }
- if(cnt%2==0)reverse(vec.begin(),vec.end());//如果该层为双数层,反转数组
- ans.push_back(vec);//把该层val值数组放入答案数组中
- cnt++;//该层处理完成后层数加一
- }
- return ans;
- }
- };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |