题目:
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]
]
思路:注意到上一层最后遍历到的节点的子节点会在下一层先遍历,因此用stack来实现。定义两个stack,分别储存奇数层和偶数层的节点,然后按层遍历即可。
class Solution {
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
vector<vector<int>> result;
if (root == nullptr) return result;
stack<TreeNode*> odd_level;
stack<TreeNode*> even_level;
bool odd = true;
odd_level.push(root);
while (!odd_level.empty() || !even_level.empty()) {
if (odd) { //traverse odd level
vector<int> new_level;
while (!odd_level.empty()) {
TreeNode* current = odd_level.top();
odd_level.pop();
new_level.push_back(current->val);
if (current->left != nullptr) even_level.push(current->left);
if (current->right != nullptr) even_level.push(current->right);
}
result.push_back(new_level);
odd = false;
} else { //traverse even level
vector<int> new_level;
while (!even_level.empty()) {
TreeNode* current = even_level.top();
even_level.pop();
new_level.push_back(current->val);
if (current->right != nullptr) odd_level.push(current->right);
if (current->left != nullptr) odd_level.push(current->left);
}
result.push_back(new_level);
odd = true;
}
}
return result;
}
};
总结:复杂度为O(2^n),n为树的高度。