题目:
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
题目分析
- 要求
从上往下 (相邻层遍历方向相反)
奇数层 ==> 从左往右遍历
偶数层 ==> 从右往左遍历
分析
用队列存储每一层的结点
读取结点值 + 存储下一层的结点
解题思路
变量 | 作用 |
---|---|
line | 存储结点的队列 |
ans | 存放遍历结果 |
store | 存储一层遍历结果 |
flag | 标志遍历方向 |
过程
队列非空
- for循环反映每一层的长度
- 取出队首元素
- 读取值 + 孩子结点放入队列
- 如果 flag != 1 store逆置
代码如下
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if(!root) return{};
vector<vector<int>> ans;
queue<TreeNode*> line{{root}};
int flag = 1;
while (!line.empty()) {
vector<int> store;
int length = line.size();
for(int i = 0; i < length; ++i) { //求每一层的遍历结果
TreeNode* temp = line.front();
line.pop();
store.push_back(temp->val);
if(temp->left) line.push(temp->left); //孩子结点放入队列
if(temp->right) line.push(temp->right);
}
if(flag == 1) ans.push_back(store); //从左往右遍历
else {
reverse(store.begin(),store.end()); //从右往左遍历
ans.push_back(store);
}
flag = -flag;
}
return ans;
}
};