难度中等262
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回锯齿形层次遍历如下:
[ [3], [20,9], [15,7] ]
解题思路:题目要求锯齿形遍历,也可以理解为锯齿形输出,而在遍历的时候依然是左右顺序遍历。只需要在存储的时候先用临时变量容器存储,在根据定义的标志位,进行判断是否需要逆序输出,从而实现了锯齿形输出。。。
代码如下:
/**
* 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>> res;
res.clear();
if(root == NULL){
return res;
}
queue<TreeNode*>q;
vector<int>v;
v.clear();
TreeNode* node = NULL;
q.push(root);
int flag = 0;
while(!q.empty()){
v.clear();
int l = q.size();
//存储结点值的中间容器
vector<int>v1;
v1.clear();
for(int i = 0; i<l; i++){
node = q.front();
q.pop();
v1.push_back(node->val);
if(node->left != NULL){
q.push(node->left);
}
if(node->right != NULL){
q.push(node->right);
}
}
//根据标志,判断是否需要逆序输出
if(flag){
for(int i=v1.size()-1; i>=0; i--){
v.push_back(v1[i]);
}
res.push_back(v);
}
else{
res.push_back(v1);
}
//每遍历一层,需要将标志位取反
flag = !flag;
}
return res;
}
};