给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [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>>out;
if(root==NULL)
return out;
//用队列存储节点指针
queue<TreeNode*>record;
//先将根节点给队列
record.push(root);
//标志位,用于判断何时将向量颠倒
bool flag=true;
while(!record.empty())
{
//目前队列中的数量,用n值保存,表示这一层有多少个
int n=record.size();
//零时向量,存储每层的值
vector<int>tmp;
//循环n次
while(n--)
{
//取出队头
TreeNode*node=record.front();
//弹出对头
record.pop();
tmp.push_back(node->val);
//左孩子不为空,将左孩子放入队列中
if(node->left!=NULL)
record.push(node->left);
//右孩子不为空,将右孩子放入队列中
if(node->right!=NULL)
record.push(node->right);
}
//如果flag为假需要将tmp的值颠倒,再将tmp向量加入到out向量中
if(flag==false)reverse(tmp.begin(),tmp.end());
//将tmp向量加入到out向量中
out.push_back(tmp);
//遍历一层之后,重新置位
flag=!flag;
}
return out;
}
};
来源:CSDN
作者:工科扫地僧
链接:https://blog.csdn.net/SHAOYEZUIZUISHAUI/article/details/104447332