题目描述:
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
方法1:栈实现
主要思路:
(1)一般的层次遍历使用队列,但这里要求的是锯齿形的遍历,既需要将之前压入的最后输出,最后压入的,在拐到下一层后,立刻输出,这就是典型的栈,故考虑使用栈来实现;
(2)使用两个栈,分别交替存储相邻的行,但在压入行其下一行时,要注意压入的左右结点先后顺序不一样,保证锯齿形的有序输出;
/**
* 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) {
if(root==NULL)
return vector<vector<int>>();
//使用两个辅助栈
stack<TreeNode*> st1;
stack<TreeNode*> st2;
//先将根节点压入
st1.push(root);
TreeNode* tmp=NULL;
vector<vector<int>> res;//存储结果
while(!st1.empty()||!st2.empty()){
vector<int> vec;//存储当前层的结果
//找出非空的栈
if(!st1.empty()){
//弹出栈中的所有元素,即为当前层的元素
while(!st1.empty()){
//获得当前结点
tmp=st1.top();
st1.pop();
vec.push_back(tmp->val);
//先做后右
if(tmp->left)
st2.push(tmp->left);
if(tmp->right)
st2.push(tmp->right);
}
res.push_back(vec);//压入当前层的结果
}
else{
while(!st2.empty()){
tmp=st2.top();
st2.pop();
vec.push_back(tmp->val);
//先右后左
if(tmp->right)
st1.push(tmp->right);
if(tmp->left)
st1.push(tmp->left);
}
res.push_back(vec);//压入当前层的结果
}
}
return res;
}
};