# 【LeetCode】 103. Binary Tree Zigzag Level Order Traversal ## Description > 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). > 給一棵二元樹,按照蜿蜒階層順序(zigzag level order)回傳它的每個節點的值。(先從左到右,下一個階層從右到左,以此類推)。 ## 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] ] ``` ## Solution * 偷懶的方法,去把[102. Binary Tree Level Order Traversal](https://hackmd.io/@Zero871015/LeetCode-102)的Code先複製過來,得到一般的`level order`之後,再把奇數階的反轉即可。 ### Code ```C++=1 /** * 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: void BFS(vector<vector<int>>& ans,vector<int>& nodes,vector<pair<TreeNode*,int>>& queue,int &level) { //take new node from queue pair<TreeNode*,int> n = queue.front(); queue.erase(queue.begin()); if(!n.first)return; //check level if(level==n.second) nodes.push_back(n.first->val); else { level = n.second; ans.push_back(nodes); nodes.clear(); nodes.push_back(n.first->val); } //push next node into queue queue.push_back(pair<TreeNode*,int>(n.first->left,n.second+1)); queue.push_back(pair<TreeNode*,int>(n.first->right,n.second+1)); //run until queue is empty while(queue.size()!=0) BFS(ans,nodes,queue,level); //check last level is pushed if(nodes.size()!=0) { ans.push_back(nodes); nodes.clear(); } } vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> ans; vector<int> nodes; int level=0; vector<pair<TreeNode*,int>> queue(1,pair<TreeNode*,int>(root,0)); BFS(ans,nodes,queue,level); for(int i=0;i<ans.size();i++) { if(i%2) reverse(ans[i].begin(),ans[i].end()); } return ans; } }; ``` ###### tags: `LeetCode` `C++`