leetcode 103.二叉树的锯齿形层序遍历
题干
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
题解
一开始的想法,和一般层序遍历没什么区别,只要在最后把所有奇数下标的数组倒置即可
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > ans;
if(root == nullptr){
return ans;
}
queue<TreeNode*> treeLevel;
treeLevel.push(root);
while(!treeLevel.empty()){
vector<int> temp;
int levelSize = treeLevel.size();
for(int i = 0 ; i < levelSize ; ++i){
auto now = treeLevel.front();
treeLevel.pop();
if(now->left != nullptr){
treeLevel.push(now->left);
}
if(now->right != nullptr){
treeLevel.push(now->right);
}
temp.push_back(now->val);
}
ans.push_back(temp);
}
for(int i = 0 ; i < ans.size() ; ++i){
if(i % 2 == 1){
reverse(ans[i].begin(),ans[i].end());
}
}
return ans;
}
};
其实还可以用双端队列(deque push_front push_back),这样避免了最后倒置的处理
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > ans;
if(root == nullptr){
return ans;
}
queue<TreeNode*> treeLevel;
treeLevel.push(root);
bool isOddLevel = false;
while(!treeLevel.empty()){
deque<int> oddLevel;
int levelSize = treeLevel.size();
for(int i = 0 ; i < levelSize ; ++i){
auto now = treeLevel.front();
treeLevel.pop();
if(isOddLevel){
oddLevel.push_front(now->val);
}else{
oddLevel.push_back(now->val);
}
if(now->left != nullptr){
treeLevel.push(now->left);
}
if(now->right != nullptr){
treeLevel.push(now->right);
}
}
isOddLevel = !isOddLevel;
ans.push_back(vector<int>{
oddLevel.begin(),oddLevel.end()});
}
return ans;
}
};