Binary Tree Zigzag Level Order Traversal
Q: 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 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
A: 借助队列
1 struct QueueNode 2 { 3 TreeNode *node; 4 int level; 5 QueueNode(TreeNode *n, int l):node(n),level(l){} 6 }; 7 class Solution { 8 public: 9 vector<vector<int> > zigzagLevelOrder(TreeNode *root) { 10 // Start typing your C/C++ solution below 11 // DO NOT write int main() function 12 vector<vector<int>> result; 13 if(!root) 14 return result; 15 16 vector<int> set; 17 queue<QueueNode> q; 18 int levelcount = 0; 19 bool bForward = true; 20 21 q.push(QueueNode(root,levelcount)); 22 while(!q.empty()) 23 { 24 QueueNode qnode = q.front(); 25 q.pop(); 26 if(qnode.level>levelcount) 27 { 28 if(bForward) 29 result.push_back(vector<int>(set.begin(),set.end())); //循环过程中,遍历到tree的新level层的节点时,把上层节点的值插入到结果集中。 30 else 31 result.push_back(vector<int>(set.rbegin(),set.rend())); 32 33 bForward = !bForward; 34 levelcount++; 35 set.clear(); 36 } 37 set.push_back(qnode.node->val); 38 39 if(qnode.node->left) 40 q.push(QueueNode(qnode.node->left,qnode.level+1)); 41 if(qnode.node->right) 42 q.push(QueueNode(qnode.node->right,qnode.level+1)); 43 } 44 45 if(bForward) 46 result.push_back(vector<int>(set.begin(),set.end())); //循环结束后,别忘了把最后一层节点的值写到结果集中!! 47 else 48 result.push_back(vector<int>(set.rbegin(),set.rend())); 49 50 return result; 51 52 } 53 };