20.12.22 103. 二叉树的锯齿形层序遍历
题目
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
思路
- 剑指做过,本来以为会很快写完,还有写出bug来了,用了15分钟
- 想好用什么数据结构和流程是怎么样就可以了
- 我的思路是用两个栈,第一层是root;第二层从左往右压入,读出时就是从右往左;第三层从右往左压入,读出时就是从左往右
- 看了题解,用deque,思路是用queue层序遍历,把该层的数据压入deque。压入deque分两种情况,从头压入和从尾压入
代码
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if(!root) return {};
vector<vector<int>> ans;
stack<TreeNode*> s1,s2;
s1.push(root);
while(!s1.empty() || !s2.empty()){
vector<int> ansP;
if(!s1.empty()){
while(!s1.empty()){
TreeNode *curr = s1.top();
s1.pop();
ansP.push_back(curr->val);
if(curr->left) s2.push(curr->left);
if(curr->right) s2.push(curr->right);
}
}else{
while(!s2.empty()){
TreeNode *curr = s2.top();
s2.pop();
ansP.push_back(curr->val);
if(curr->right) s1.push(curr->right);
if(curr->left) s1.push(curr->left);
}
}
ans.push_back(ansP);
}
return ans;
}
};