leetcode刷题(剑指offer) 103.二叉树的锯齿形层序遍历

103.二叉树的锯齿形层序遍历

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

示例 1:

img

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

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000]
  • -100 <= Node.val <= 100

解题思路与二叉树的层序遍历类似,我则是在遍历的基础上加了方向的标志位,依靠判断方向的标志位,对数组进行翻转。

代码如下:

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
   
		if (null == root) {
   
            return new ArrayList<>();
        }
        Queue<TreeNode> queue = new ArrayDeque<>();
        TreeNode lastNode = root;
        TreeNode nextLastNode = null;
        // 0 表示从左往右, 1表示从右往左
        int direction = 0;
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
   
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.left != null) {
   
                queue.add(node.left);
                nextLastNode = node.left;
            }
            if (node.right != null) {
   
                queue.add(node.right);
                nextLastNode = node.right;
            }


            if (node == lastNode) {
   
                lastNode = nextLastNode;
                if (direction == 1) {
   
                    Collections.reverse(list);
                }
                res.add(list);
                list = new ArrayList<>();
                direction = 1 - direction;
            }
        }
        return res;
    }

但是这种方法是不是太笨了呢,明明可以直接存好,还特意进行了依次翻转逻辑,所以参考了大佬的代码。

直接遍历每一层的节点,然后根据当前是层级的奇偶,来对数组进行前向添加数据和后向添加数据,代码如下:

public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
   
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if (root != null) {
   
            queue.add(root);
        }
        while (!queue.isEmpty()) {
   
            LinkedList<Integer> list = new LinkedList<>();
            // queue里面是一层所有的节点
            for (int i = queue.size(); i > 0; i--) {
   
                TreeNode node = queue.poll();
                if (res.size() % 2 == 0) {
   
                    list.addLast(node.val);
                } else {
   
                    list.addFirst(node.val);
                }
                if (node.left != null) {
   
                    queue.add(node.left);
                }
                if (node.right != null) {
   
                    queue.add(node.right);
                }
            }
            res.add(list);
        }
        return res;
    }

相关推荐

  1. 【力扣练习】103. 锯齿

    2024-02-03 08:14:03       45 阅读
  2. LeetCode [103] 锯齿

    2024-02-03 08:14:03       36 阅读
  3. 【C++】每日一 103 锯齿

    2024-02-03 08:14:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-03 08:14:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-03 08:14:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-03 08:14:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-03 08:14:03       20 阅读

热门阅读

  1. 【CSS系列】常用容易忽略的css

    2024-02-03 08:14:03       32 阅读
  2. MySQL生成某一年的所有日期

    2024-02-03 08:14:03       32 阅读
  3. 无人水下攻击机器人

    2024-02-03 08:14:03       27 阅读
  4. 前端 使用 pdf.js加载PDF文件

    2024-02-03 08:14:03       27 阅读
  5. Vue - 面试题持续更新

    2024-02-03 08:14:03       29 阅读
  6. 什么是ISO21434网络安全中的威胁建模?-亚远景

    2024-02-03 08:14:03       34 阅读
  7. CentOS设置定时任务

    2024-02-03 08:14:03       29 阅读
  8. 如何快速使用Jupyter Notebook

    2024-02-03 08:14:03       30 阅读