解法1:就是把102的按层次打印的那道题的程序拿过来,加上一个符号(fromRight)表示是否zigzag,该符号每行flip一次,然后每次zigzag的时候把对应的vector反过来。
该解法比较慢,因为要翻转。Leetcode的执行时间为6ms。
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > vv;
queue<TreeNode*> q;
q.push(root);
if (root) q.push(NULL);
vector<int> v;
bool fromRight=true;
while(!q.empty()) {
TreeNode* t=q.front();
q.pop();
if (t) {
v.push_back(t->val);
if (t->right) q.push(t->right);
if (t->left) q.push(t->left);
}
else{ //line end reached
if (v.size()) {
if (fromRight) {
reverse(v.begin(), v.end());
}
vv.push_back(v);
}
if (q.empty()) break;
v.clear();
q.push(NULL);
fromRight=!fromRight;
}
}
return vv;
}
解法2:用deque。也是加上一个zigzag符号,每行flip。该解法跟102的解法2类似,但是用的deque,并且隔行分别用的pop_\front()/push_back() 和
pop_\back()/push_front()。该解法比较快,leetcode执行时间为4ms。
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > vv;
deque<TreeNode*> dq;
if (root) dq.push_back(root);
vector<int> v;
bool right2left=false;
while(!dq.empty()) {
TreeNode* t;
int len=dq.size();
while (len--) {
if (right2left) {
t=dq.front();
dq.pop_front();
v.push_back(t->val);
if (t->right) dq.push_back(t->right);
if (t->left) dq.push_back(t->left);
}else{
t=dq.back();
dq.pop_back();
v.push_back(t->val);
if (t->left) dq.push_front(t->left);
if (t->right) dq.push_front(t->right);
}
}
vv.push_back(v);
if (dq.empty()) return vv;
v.clear();
right2left=!right2left;
}
return vv;
}
int main()
{
// vector<vector<int> > vv=zigzagLevelOrder(NULL);
TreeNode t1(3);
TreeNode t2(9);
TreeNode t3(20);
TreeNode t4(15);
TreeNode t5(7);
t1.left=&t2;
t1.right=&t3;
t3.left=&t4;
t3.right=&t5;
vector<vector<int> > vv=zigzagLevelOrder(&t1);
cout<<"["<<endl;
for (auto v : vv) {
cout<<" [ ";
for (auto i : v) {
cout<<i<<" ";
}
cout<<"]"<<endl;
}
cout<<"]"<<endl;
return 0;
}