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 };

 

posted @ 2013-05-30 16:24  summer_zhou  阅读(178)  评论(0编辑  收藏  举报