(树) 剑指 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---力扣专栏,每日更新!

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

相关推荐
硕风和炜1 小时前
【LeetCode: 112. 路径总和 + 二叉树 + 递归】
java·算法·leetcode·面试·二叉树·递归
Flerken1012 小时前
力扣【SQL连续问题】
数据库·sql·算法·leetcode·数据分析
走在考研路上3 小时前
力扣242.有效的字母异位词
算法·leetcode·职场和发展
sjsjs113 小时前
【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数
数据结构·算法·leetcode
嘻嘻哈哈樱桃3 小时前
有效字母异位词力扣--242
java·javascript·leetcode
就爱学编程6 小时前
力扣刷题:二叉树OJ篇(上)
算法·leetcode·职场和发展
呆呆的猫10 小时前
【LeetCode】803、打砖块
算法·leetcode·职场和发展
2401_8582861116 小时前
L27.【LeetCode笔记】2 的幂(五种解法)
c语言·开发语言·笔记·算法·leetcode
chenziang116 小时前
leetcode hot 100 不同路径
算法·leetcode·职场和发展