题目:Binary Tree Zigzag Level Order Traversal
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] ]
这道题类似Binary Tree Level Order Traversal,链接:http://www.cnblogs.com/laihaiteng/p/3797748.html,不同点在于相邻层次的遍历顺序不同,可以基于前面这道题的算法,增加一个层次号标记,把偶数层的遍历顺序逆序,再添加到vector中即可。我下面的思路稍稍有些不同,是利用栈和层次号来实现当场的zigzag遍历,而不是先正常的BFS,再依据层次号做改变。
个人思路:
1、逐层处理,每层的节点都放入队列A中,并记录层次号
2、当A队列出队时,将出队的节点值存储到相应层次的vector<int>中,并将该节点入栈B
3、当A队列为空时,表明该层的节点已经处理完毕,该处理下一层的节点了,将该层的vector<int>放入总的vector<vector<int> >,然后判断层次号是奇数还是偶数,由于通过栈B将上一层节点逆序了,可以很方便地进行zigzag遍历,按照栈的出栈顺序,奇数就先将出栈节点的左孩子入队,然后右孩子入队,偶数则顺序相反,直到栈为空,此时下一层节点已经按照zigzag的顺序入队列A了,重复2-3的步骤,直到节点全部遍历完
代码:
1 #include <stddef.h> 2 #include <stack> 3 #include <queue> 4 #include <vector> 5 6 using namespace std; 7 8 struct TreeNode 9 { 10 int val; 11 TreeNode *left; 12 TreeNode *right; 13 TreeNode(int x) : val(x), left(NULL), right(NULL) {} 14 }; 15 16 class Solution 17 { 18 public: 19 vector<vector<int> > zigzagLevelOrder(TreeNode *root) 20 { 21 vector<vector<int> > total_result; 22 vector<int> level_result; 23 queue<TreeNode *> level_treeNode; 24 stack<TreeNode *> level_treeNode_bak; 25 26 if (!root) 27 { 28 return total_result; 29 } 30 31 int level_num = 1; 32 level_treeNode.push(root); 33 34 while (!level_treeNode.empty()) 35 { 36 TreeNode *current = level_treeNode.front(); 37 level_treeNode.pop(); 38 level_treeNode_bak.push(current); 39 level_result.push_back(current->val); 40 41 //表明该层遍历完成 42 if (level_treeNode.empty()) 43 { 44 total_result.push_back(level_result); 45 level_result.clear(); 46 ++level_num; 47 48 if (level_num % 2) 49 { 50 while (!level_treeNode_bak.empty()) 51 { 52 current = level_treeNode_bak.top(); 53 level_treeNode_bak.pop(); 54 if (current->left) 55 { 56 level_treeNode.push(current->left); 57 } 58 if (current->right) 59 { 60 level_treeNode.push(current->right); 61 } 62 } 63 } 64 else 65 { 66 while (!level_treeNode_bak.empty()) 67 { 68 current = level_treeNode_bak.top(); 69 level_treeNode_bak.pop(); 70 if (current->right) 71 { 72 level_treeNode.push(current->right); 73 } 74 if (current->left) 75 { 76 level_treeNode.push(current->left); 77 } 78 } 79 } 80 } 81 } 82 83 return total_result; 84 } 85 };
看了一下网上的几篇文章,思路差不多,都是基于BFS算法,然后按照层次号奇偶来进行遍历顺序的逆反