题目要求
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
题解
https://github.com/soulmachine/leetcode
递归
class Solution {
public:
void traverse(TreeNode* root,int level,bool l2r,vector<vector<int>> &result){
if(!root) return;
if(level>result.size()) result.push_back(vector<int>());
if(l2r)
result[level-1].push_back(root->val);
else
result[level-1].insert(result[level-1].begin(),root->val); // 666666
traverse(root->left,level+1,!l2r,result);
traverse(root->right,level+1,!l2r,result);
}
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if(!root) return result;
traverse(root,1,true,result);
return result;
}
};
遍历
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if(!root) return result;
queue<TreeNode*> cur,next;
vector<int> level;
bool l2r=true;
cur.push(root);
while(!cur.empty()){
while(!cur.empty()){
TreeNode *node=cur.front();
cur.pop();
level.push_back(node->val);
if(node->left) next.push(node->left);
if(node->right) next.push(node->right);
}
if(l2r)
result.push_back(level);
else{
reverse(level.begin(),level.end()); // *
result.push_back(level);
}
// *
level.clear();
swap(next,cur);
l2r=!l2r;
}
return result;
}
};