Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
思路:
其实同第102题一样 ,我们也是一层一层的遍历,只是这一次使用迭代的方式(上一题使用的是递归),但是再输出的时候每层的顺序有变化。我首先想到的是用双向链表,后来发现:我在输出的时候改变方向不就好了吗。。。
1 双向链表
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> vv;
deque<TreeNode*> records;
if(root) records.push_front(root);
TreeNode *last = root;
int layer = 1;
while (records.size()){
TreeNode *curr;
if (vv.size() < layer) vv.push_back({});
if (layer % 2){
curr = records.front();
records.pop_front();
vv[layer - 1].push_back(curr->val);
if (curr->left) records.push_back(curr->left);
if (curr->right) records.push_back(curr->right);
}
else{
curr = records.back();
records.pop_back();
vv[layer - 1].push_back(curr->val);
if (curr->right) records.push_front(curr->right);
if (curr->left) records.push_front(curr->left);
}
if (last == curr && records.size()){
layer++;
last = layer % 2 ? records.back() : records.front();
}
}
return vv;
}
2 直接改变输出
vector<vector<int>> zigzagLevelOrder2(TreeNode* root) {
vector<vector<int>> vv;
queue<TreeNode*> records;
if (root) records.push(root);
TreeNode *last = root;
int layer = 1;
while (records.size()){
TreeNode *curr = records.front();
records.pop();
if (vv.size() < layer) vv.push_back({});
vv[layer - 1].insert(layer % 2 ? vv[layer - 1].end() : vv[layer - 1].begin(), curr->val);
if (curr->left) records.push(curr->left);
if (curr->right) records.push(curr->right);
if (curr == last && records.size()){
layer++;
last = records.back();
}
}
return vv;
}
但是两种方式的速度是一样的,纪念贴图: