题目:
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] ]
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
思路:这道题的解法和思路和Binary Tree Level Order Traversal差不多,只不过我们需要设个标志位来区分,这行是正序还是反序输出数组。我们利用队列来存储树的节点,并用NULL来区分每一行,记得当队列非空时,处理完每一行,都需要清空level数组,并加入NULL,区别下一行。我们设置tag, tag为True,表示正序,从左到右输出数组,tag为false, 表示反序,从右往左输出数组。
Attention:
1. 记得处理完每一行后,当队列非空时,清空数组level, 并且往队列中加入NULL,区分下一行。
2. reverse的用法
void reverse (BidirectionalIterator first, BidirectionalIterator last);
std::reverse(myvector.begin(),myvector.end());
3. 用tag来区分输出顺序。记得每次都需要tag取反,下次是反方向。
if(tag)
{
ret.push_back(level);
}
else
{
reverse(level.begin(), level.end());
ret.push_back(level);
}
tag = !tag;
复杂度:O(N),N为树的节点个数。
AC Code:
/**
* Definition for binary tree
* 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>> ret;
if(root == NULL) return ret;
vector<int> level;
bool tag = true;
queue<TreeNode*> TreeQ;
TreeQ.push(root);
TreeQ.push(NULL); //区分分层
while(!TreeQ.empty())
{
TreeNode* node = TreeQ.front();
TreeQ.pop();
if(node != NULL)
{
level.push_back(node->val);
if(node->left) TreeQ.push(node->left);
if(node->right) TreeQ.push(node->right);
}
else
{
if(tag)
{
ret.push_back(level);
}
else
{
reverse(level.begin(), level.end());
ret.push_back(level);
}
tag = !tag;
if(!TreeQ.empty())
{
level.clear();
TreeQ.push(NULL);
}
}
}
return ret;
}
};