描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 100∣val∣<=100
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
示例1
输入:
{1,2,3,#,#,4,5}
复制返回值:
[[1],[3,2],[4,5]]
复制说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
思路:
1.按正常的层次遍历方法,用队列存储节点
2.需要记录每一层有多少个节点,遍历的时候只取当前层的数据
3.需要记录奇数偶数层,偶数层需要把遍历结果反转一下
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
if(!pRoot) return {};
queue<TreeNode*> q;
vector<vector<int> > res;
q.push(pRoot);
int level=1;
while(!q.empty()){
vector<int> ans;
int size=q.size(); //记录当前层节点数
for(int i=0;i<size;i++){ //遍历当层节点
TreeNode* node=q.front();
q.pop();
ans.push_back(node->val);
if(node->left)q.push(node->left);
if(node->right)q.push(node->right);
}
if(level%2==0){ //偶数层列表反转
reverse(ans.begin(), ans.end());
}
res.push_back(ans);
level++; //修改层
}
return res;
}
};