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] ]
具体解题思路:要采用之字形按层次遍历树,这里采用了两个栈来完成,由于遍历的时候是交叉从左到右或者从右到左的顺序,所以这里采用了flag来判断当前是应该按照从左到右还是从右到左的顺序。st1保存的是需要从右到左来遍历下一层的节点,st2保存的是需要从左到右来遍历下一层的节点。因此判断的依据就是当st1和st2都为空时整棵树就遍历完成。
class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { //vector<int> temp; vector<vector<int> > result; if(root == NULL) return result; stack<TreeNode*> st1; stack<TreeNode*> st2; int flag = 0; st1.push(root); while(st1.size()!=0 || st2.size() !=0) { if(flag == 0 && st1.size()>0) { vector<int> temps; while(st1.size()>0) { TreeNode* temp = st1.top(); if(temp->left != NULL) st2.push(temp->left); if(temp->right != NULL) st2.push(temp->right); st1.pop(); temps.push_back(temp->val); } result.push_back(temps); flag = 1; } if(flag == 1 && st2.size()>0) { vector<int> temps; while(st2.size()>0) { TreeNode* temp = st2.top(); if(temp->right != NULL) st1.push(temp->right); if(temp->left != NULL) st1.push(temp->left); st2.pop(); temps.push_back(temp->val); } result.push_back(temps); flag = 0; } } return result; } };