从上到下打印二叉树III(剑指Offer-32.3)
题面
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如: 给定二叉树:
[3,9,20,null,null,15,7]
,1 3 2 / \ 3 9 20 4 / \ 5 15 7
返回:
1[ 2 [3], 3 [20,9], 4 [15,7] 5]
限制
1节点总数 <= 1000
思路
BFS层序遍历,加个标记,当一层遍历完时,队列里即是下一层,使用q.back()更新标记即可。
再加个行号判断奇偶,决定是否reverse即可。
代码
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8 * };
9 */
10class Solution {
11public:
12 vector<vector<int>> levelOrder(TreeNode* root) {
13 vector<vector<int> > ans;
14 vector<int> row;
15 if(root==NULL) return ans;
16
17 queue<TreeNode *>q;
18 q.push(root);
19 TreeNode *end = root;
20 int line = 0;
21
22 while(!q.empty()){
23 TreeNode *t = q.front(); q.pop();
24 row.push_back(t->val);
25 if(t->left)
26 q.push(t->left);
27 if(t->right)
28 q.push(t->right);
29 if(t == end){
30 if(line & 1)
31 reverse(row.begin(), row.end());
32 ans.push_back(row);
33 line++;
34 row.clear();
35 end = q.back();
36 }
37 }
38 return ans;
39 }
40};