题目:
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,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[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>> result;
if(root == NULL)return result;
vector<TreeNode *> nodes(1,root);
vector<int> res(1,root->val);
bool direction = false;
while(!nodes.empty()){
result.push_back(res);
res.clear();
vector<TreeNode *>newNodes;
if(!direction){
for(int i = nodes.size() -1; i >= 0; i--){
if(nodes[i]->right != NULL){
newNodes.push_back(nodes[i]->right);
res.push_back(nodes[i]->right->val);
}
if(nodes[i]->left != NULL){
newNodes.push_back(nodes[i]->left);
res.push_back(nodes[i]->left->val);
}
}
direction = true;
}
else{
for(int i = nodes.size() - 1; i >= 0; i--){
if(nodes[i]->left != NULL){
newNodes.push_back(nodes[i]->left);
res.push_back(nodes[i]->left->val);
}
if(nodes[i]->right != NULL){
newNodes.push_back(nodes[i]->right);
res.push_back(nodes[i]->right->val);
}
}
direction = false;
}
nodes = newNodes;
}
return result;
}
};