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]]
要想按照Z字形打印结果,那么就是按照层次遍历并且每一层的遍历方向不同,那么采用栈先进后出的思想,对于父节点先进的后遍历它的子节点可以实现层次交叉
方向打印,用两个栈分别保存父节点和子节点已遍历的顺序,不停交叉直到两个栈的内容都为空。
/** * 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 printResult(vector<vector<int> > &s) { int n = s.size(); for(int i=0;i<n;i++) { vector<int> k = s[i]; for(int j=0;j<k.size();j++) { cout<<k[j]<<" "; } cout<<endl; } } 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; printResult(result); } 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; printResult(result); } } return result; } };