剑指offer 33. 之字形打印二叉树

简介: 剑指offer 33. 之字形打印二叉树

题目描述

请实现一个函数按照之字形顺序从上向下打印二叉树

即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

数据范围

树中节点的数量 [0,1000]。

样例

输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
   8
  / \
 12  2
 / \
6   4
输出:[[8], [2, 12], [6, 4]]

方法一:BFS O(n)


这道题同样和按层打印的操作几乎一样,只是在此基础上又加了一个按 Z 字形打印的条件。我们还是按照正常的遍历每层结点的操作来,只是额外设置一个变量 flag 并初始化为 1 ,每层遍历开始都乘以 -1 。这样在每层遍历结束后可以通过 flag 来判断该层的结点是正向输出还是反向输出。


我们拿题目的样例来举例,看看具体的实现过程:


初始化: 将根结点推入队列中,并将 flag 初始化为 1 。


3fbc0480bf404d13bc9123ec92f33158.png


第一轮遍历:flag * -1 = -1k = 1 ,将队列中元素弹出放入临时数组 temp 中并将其孩子结点推入队列当中。更新 ans 数组,发现 flag = -1 故不用反转数组,直接将 temp 更新到 ans 中即可。

7770ccf056404314aed47bef0c2456d3.png


第二轮遍历: flag * -1 = 1k = 2 ,将队列中元素弹出放入临时数组 temp 中并将其孩子结点推入队列当中。更新 ans 数组,发现 flag = 1 故要反转 temp 数组,然后再将 temp 更新到 ans 中。


80c6cab57c454be383e7b609313b1931.png


第三轮遍历: flag * -1 = -1k = 2 ,将队列中元素弹出放入临时数组 temp 中并将其孩子结点推入队列当中。更新 ans 数组,发现 flag = -1 故不用反转数组,直接将 temp 更新到 ans 中即可。

2408daa9616f49b59589c14b99de87a0.png



返回答案: 返回 ans 即可。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        if (!root)   return {};
        vector<vector<int>> ans;
        queue<TreeNode*> q;
        q.push(root);
        int flag = 1;
        while (!q.empty())
        {
            int k = q.size();
            vector<int> temp;
            flag *= -1;
            while (k--)
            {
                auto t = q.front();
                temp.push_back(t->val);
                q.pop();
                if (t->left) q.push(t->left);
                if (t->right)q.push(t->right);
            }
            if (flag == 1)
                reverse(temp.begin(), temp.end());
            ans.push_back(temp);
        }
        return ans;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
4月前
|
算法
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
44 0
|
4月前
|
存储
【剑指offer】-把二叉树打印成多行-43/67
【剑指offer】-把二叉树打印成多行-43/67
【剑指offer】-从上往下打印二叉树-22/67
【剑指offer】-从上往下打印二叉树-22/67
|
4月前
|
存储
【剑指offer】- 按之字形顺序打印二叉树-45/67
【剑指offer】- 按之字形顺序打印二叉树-45/67
|
存储 C语言
力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)
力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)
75 1
剑指offer_二叉树---之字形打印二叉树
剑指offer_二叉树---之字形打印二叉树
54 0
|
算法
【刷算法】按照之字形打印二叉树
【刷算法】按照之字形打印二叉树
|
算法 前端开发 程序员
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
98 0
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
|
算法 前端开发 程序员
「LeetCode」剑指Offer-32从上到下打印二叉树 III ⚡️
「LeetCode」剑指Offer-32从上到下打印二叉树 III ⚡️
101 0
「LeetCode」剑指Offer-32从上到下打印二叉树 III ⚡️