题目:
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] ]
思路:
刚刚做完Leetcode 102的童鞋,肯定会想到一个非常简单的方法,就是在得到Leetcode 102的结果之后,把结果中偶数行中的数字翻转一下,这个是完全可行的。这里我们使用两个数组来实现了相同的功能:在遍历某一层时,我们将下一层的数据存储在另一个数组中,同时维护一个标记,表示是正向加入还是反向加入。其余思路和Leetcode 102完全一致。
代码:
/**
* 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>> ret;
if(root == NULL) {
return ret;
}
bool forward = true;
vector<TreeNode*> forward_line;
vector<TreeNode*> backward_line;
forward_line.push_back(root);
while(forward_line.size() > 0 || backward_line.size() > 0)
{
if(forward) // put into the ret by forward order
{
vector<int> line;
for(int i = 0; i < forward_line.size(); ++i)
{
line.push_back(forward_line[i]->val);
if(forward_line[i]->left)
backward_line.push_back(forward_line[i]->left);
if(forward_line[i]->right)
backward_line.push_back(forward_line[i]->right);
}
forward_line.clear();
forward = false;
ret.push_back(line);
}
else // put into the ret by backward order
{
vector<int> line;
reverse(line.begin(), line.end());
for(int i = 0; i < backward_line.size(); ++i)
{
line.push_back(backward_line[i]->val);
if(backward_line[i]->left)
forward_line.push_back(backward_line[i]->left);
if(backward_line[i]->right)
forward_line.push_back(backward_line[i]->right);
}
reverse(line.begin(), line.end());
backward_line.clear();
forward = true;
ret.push_back(line);
}
}
return ret;
}
};