给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
方法
基于二叉树的层序遍历,定义一个标志位isOrderLeft,每访问完一层就取反,同时定义一个deque,如果isOrderLeft为真,就向deque尾部插入元素,反之向deque的头部插入元素。
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> ans;
queue<TreeNode*> nodeQueue;
if (!root) return ans;
nodeQueue.push(root);
bool isOrderLeft = true;
while (!nodeQueue.empty()) {
int size = nodeQueue.size();
deque<int> tmp;
for (int i=0; i<size; ++i) {
auto node = nodeQueue.front();
nodeQueue.pop();
if (isOrderLeft) {
tmp.push_back(node->val);
} else {
tmp.push_front(node->val);
}
if (node->left) {
nodeQueue.push(node->left);
}
if (node->right) {
nodeQueue.push(node->right);
}
}
ans.push_back({tmp.begin(), tmp.end()});
isOrderLeft = !isOrderLeft;
}
return ans;
}
};