讲下思路:*非递归**,双栈
- 利用栈1
s1
储存奇数层的点,s2
储存偶数层的点,所以根结点就储存在s2
里; - 当前层为偶数层时,说明此时
s1
是空的,为了让下一层结点从s1
出来的时候从右到左,所以让左结点先进栈,毕竟先进后出嘛; - 当前层为奇数层时,说明此时
s2
是空的,且s1
结点出来时从右到左,为了让下一层结点从s2
出来的时候从左到右,所以让右结点先进栈,先进后出; - 记得每次层数+1,将本层结点用一个vector储存。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root==NULL) return ans;
stack<TreeNode*> s1;
stack<TreeNode*> s2;
s1.push(root);
int height=1;
while(!s1.empty()||!s2.empty())
{
int size;
if(height%2==1) size=s1.size();
else size=s2.size();
vector<int> tmp;
while(size--)
{
if(height%2==1)
{
TreeNode* node=s1.top();
tmp.push_back(node->val);
s1.pop();
if(node->left) s2.push(node->left);
if(node->right) s2.push(node->right);
}
if(height%2==0)
{
TreeNode* node=s2.top();
tmp.push_back(node->val);
s2.pop();
if(node->right) s1.push(node->right);
if(node->left) s1.push(node->left);
}
}
height++;
ans.push_back(tmp);
}
return ans;
}
};