【二叉树】Leetcode 103. 二叉树的锯齿形层序遍历【中等】

二叉树的锯齿形层序遍历

  • 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:


输入 :root = 3,9,20,null,null,15,7
输出\[3,20,9,15,7]

解题思路

广度优先搜索 (BFS):

  • 使用队列进行BFS,从根节点开始逐层遍历二叉树。

双端队列:

  • 使用双端队列来存储当前层的节点值。在左到右的层中,我们从尾部添加节点值;在右到左的层中,我们从头部添加节点值。

层次遍历和方向切换:

  • 每一层结束后,切换遍历方向。

Java实现

java 复制代码
public class ZigzagLevelOrder {
    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        boolean leftToRight = true;

        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            Deque<Integer> levelNodes = new LinkedList<>();
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                if (leftToRight) {
                    levelNodes.addLast(node.val);
                } else {
                    levelNodes.addFirst(node.val);
                }

                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            result.add(new ArrayList<>(levelNodes));
            leftToRight = !leftToRight;
        }

        return result;
    }

    public static void main(String[] args) {
        ZigzagLevelOrder zigzagLevelOrder = new ZigzagLevelOrder();

        // 构建示例二叉树
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(9);
        root.right = new TreeNode(20);
        root.right.left = new TreeNode(15);
        root.right.right = new TreeNode(7);

        // 计算锯齿形层序遍历
        List<List<Integer>> result = zigzagLevelOrder.zigzagLevelOrder(root);
        System.out.println("Zigzag Level Order: " + result);
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点仅被访问一次。
  • 空间复杂度:O(m),其中 m 是二叉树中最宽的一层的节点数。在最坏情况下,队列中会存储最多一层的所有节点。
相关推荐
手写码匠1 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力1 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly1 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1232 小时前
SolidWorks草图转三维DWG技巧
算法
redaijufeng2 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油3 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-3 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新4 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
怪兽学LLM4 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪4 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法