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 7return 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.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ //和前一题,lever order traversal相似,不同的是需要一个isReverse的boolean型变量来记录是否要反转当前的层的节点。 //翻转的话就insert到首位,不翻转的话就push_back //lastNode用来记录当前层的最后一个节点,用来确定是否遍历到了新的层。 class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { queue<TreeNode *> q; vector<vector<int > > re; vector<int> thisRe; bool isReverse = false; if(root == NULL){ return re; } q.push(root); TreeNode * lastNode = root; while(!q.empty()){ TreeNode * p = q.front(); q.pop(); if(isReverse == false){ thisRe.push_back(p->val); } else{ thisRe.insert(thisRe.begin(), p->val); } if(p->left){ q.push(p->left); } if(p->right){ q.push(p->right); } if(p == lastNode){ re.push_back(thisRe); thisRe.clear(); isReverse = isReverse == true?false:true; if(!q.empty()){ lastNode = q.back(); } } } return re; } };