从上到下打印二叉树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};