(树) 剑指 Offer 32 - III. 从上到下打印二叉树 III ——【Leetcode每日一题】

❓剑指 Offer 32 - III. 从上到下打印二叉树 III

难度:中等

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如:

给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [20,9],
  [15,7]
]

提示

  • 节点总数 <= 1000

💡思路:BFS

解法和 剑指 Offer 32 - II. 从上到下打印二叉树 II 类似。

使用优先队列,唯一不同的是 返回值为「先从左往右,再从右往左」交替输出的锯齿形。

在这里设置有个反转的标签 re :

  • 每遍历一层 re 就取反;
  • re = true 时,则 temo 队列进行反转。

🍁代码:(C++、Java)

C++

cpp 复制代码
/**
 * 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>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        if(root == nullptr) return ans;
        queue<TreeNode*> q;
        q.push(root);
        bool re = false;
        while(!q.empty()){
            vector<int> temp;
            int cnt = q.size();
            while(cnt-- > 0){
                TreeNode* cur = q.front();
                q.pop();
                temp.push_back(cur->val);
                if(cur->left != nullptr) q.push(cur->left);
                if(cur->right != nullptr) q.push(cur->right);
            }
            if(re) reverse(temp.begin(), temp.end());
            re = !re;
            ans.push_back(temp);
        }
        return ans;
    }
};

Java

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        if(root == null) return ans;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        boolean re = false;
        while(!q.isEmpty()){
            ArrayList<Integer> temp = new ArrayList<>();
            int cnt = q.size();
            while(cnt-- > 0){
                TreeNode cur = q.poll();
                temp.add(cur.val);
                if(cur.left != null) q.add(cur.left);
                if(cur.right != null) q.add(cur.right);
            }
            if(re) Collections.reverse(temp);
            re = !re;
            ans.add(temp);
        }
        return ans;
    }
}

🚀 运行结果:

🕔 复杂度分析:

  • 时间复杂度 : O ( n ) O(n) O(n),其中 n 为二叉树的节点数。每个节点会且仅会被遍历一次。
  • 空间复杂度 : O ( n ) O(n) O(n),我们需要维护存储节点的队列,队列中元素的个数不超过 n 个。

题目来源:力扣

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN---力扣专栏,每日更新!

注: 如有不足,欢迎指正!

相关推荐
DdddJMs__13537 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
Sunyanhui12 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农2 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
AnFany7 小时前
LeetCode【0051】N皇后
python·算法·leetcode·回溯法·n皇后
可别是个可爱鬼7 小时前
代码随想录 -- 动态规划 -- 完全平方数
数据结构·python·算法·leetcode·动态规划
一直学习永不止步7 小时前
LeetCode题练习与总结:至少有 K 个重复字符的最长子串--395
java·算法·leetcode·字符串·滑动窗口·哈希表·分治
DdddJMs__1359 小时前
C语言 | Leetcode C语言题解之第552题学生出勤记录II
c语言·leetcode·题解
DdddJMs__1359 小时前
C语言 | Leetcode C语言题解之第554题砖墙
c语言·leetcode·题解
我是聪明的懒大王懒洋洋10 小时前
力扣力扣力:53.最大子数组和
算法·leetcode·职场和发展
九圣残炎11 小时前
【从零开始的LeetCode-算法】3345. 最小可整除数位乘积 I
java·算法·leetcode