1 题目
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
2 尝试解
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if(root == NULL) return result;
vector<TreeNode*> Layer{root};
traverseLayer(result,Layer,1);
return result;
}
void traverseLayer(vector<vector<int>>&result,vector<TreeNode*>&Layer, int depth){
if(Layer.empty()) return;
vector<int> temp;
vector<TreeNode*> curLayer;
for(int i = 0; i < Layer.size();i++){
temp.push_back(Layer[i]->val);
if(Layer[i]->left != NULL)curLayer.push_back(Layer[i]->left);
if(Layer[i]->right != NULL)curLayer.push_back(Layer[i]->right);
}
if(depth %2 == 0) reverse(temp.begin(),temp.end());
result.push_back(temp);
Layer.swap(curLayer);
traverseLayer(result,Layer,depth+1);
}
};
3 标准解
class Solution {
public:
vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
if (root == NULL) {
return vector<vector<int> > ();
}
vector<vector<int> > result;
queue<TreeNode*> nodesQueue;
nodesQueue.push(root);
bool leftToRight = true;
while ( !nodesQueue.empty()) {
int size = nodesQueue.size();
vector<int> row(size);
for (int i = 0; i < size; i++) {
TreeNode* node = nodesQueue.front();
nodesQueue.pop();
// find position to fill node's value
int index = (leftToRight) ? i : (size - 1 - i);
row[index] = node->val;
if (node->left) {
nodesQueue.push(node->left);
}
if (node->right) {
nodesQueue.push(node->right);
}
}
// after this level
leftToRight = !leftToRight;
result.push_back(row);
}
return result;
}
};