北邮复试刷题103. 二叉树的锯齿形层序遍历

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

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

xml 复制代码
示例 1:


输入: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

题解:

方法一:按层模拟BFS

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    public void reverse(List<Integer> list){
        int size = list.size();
        int tmp[] = new int[size];
        for(int i=0;i<size;i++){
            tmp[i] = list.get(i);
        }
        int index = 0;
        for(int i=size-1;i>=0;i--){
            list.set(index,tmp[i]);
            index++;
        }
    }

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        boolean flag = true; // true代表->   false代表<-
        List<Integer> first = new ArrayList<>();
        first.add(root.val);
        if(root.left != null)
            queue.offer(root.left);
        if(root.right != null)
            queue.offer(root.right);
        res.add(first);

        while(!queue.isEmpty()){
            List<Integer> tmp = new ArrayList<>();
            int count = queue.size();
            while(count > 0){
                TreeNode node = queue.poll();
                if(node.left != null)
                    queue.offer(node.left);
                if(node.right != null)
                    queue.offer(node.right);
                tmp.add(node.val);
                count--;
            }
            flag = !flag;
            if(!flag){
                //对此时取到的tmp顺序取反
                reverse(tmp);
            }

            res.add(tmp);
        }

        return res;
    }
}

方法二:双端队列+奇偶

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 class Solution {

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        int len = 1;// 奇数代表->   偶数代表<-
        List<Integer> first = new LinkedList<>();
        first.add(root.val);
        if(root.left != null)
            queue.offer(root.left);
        if(root.right != null)
            queue.offer(root.right);
        res.add(first);
        len++;

        while(!queue.isEmpty()){
            // 队列依旧是传统队列,但是每一个加入到res中的小list都是用双端形式,从而形式上实现双端队列
            List<Integer> tmp = new LinkedList<>();
            // 也是因为链表形式相较于数组形式更利于反转
            int count = queue.size();
            while(count > 0){
                TreeNode node = queue.poll();
                if(node.left != null)
                    queue.add(node.left);      
                if(node.right != null)
                    queue.offer(node.right);
                if(len % 2 == 0){
                    tmp.addFirst(node.val); 
                }
                else{
                    tmp.addLast(node.val);
                }
                count--;
            }
            res.add(tmp);
            len++;
        }

        return res;
    }
}
相关推荐
毕设源码-邱学长13 分钟前
【开题答辩全过程】以 基于Spring Boot的体育场地预约管理系统为例,包含答辩的问题和答案
java·spring boot·后端
青槿吖30 分钟前
第二篇:告别XML臃肿配置!Spring注解式IOC/DI保姆级教程,从入门到真香
xml·java·开发语言·数据库·后端·sql·spring
摇滚侠1 小时前
讲一讲 SpringMVC,线程变量 ThreadLocal 的使用
java·spring boot·intellij-idea
kuntli2 小时前
BIO NIO AIO核心区别解析
java
Javatutouhouduan2 小时前
京东内部强推HotSpot VM源码剖析笔记(2026新版)
java·jvm·java虚拟机·校招·java面试·java程序员·互联网大厂
imuliuliang2 小时前
怎么下载安装yarn
java
曹牧2 小时前
在 Eclipse 中配置 Maven 和 Gradle 项目以支持增量打包
java·eclipse·maven
_olone2 小时前
牛客每日一题:显生之宙(Java)
java·开发语言·算法·牛客
Sirens.2 小时前
Java 包装类、泛型与类型擦除
java·开发语言·javac
小光学长2 小时前
基于ssm的膳食健康管理系统e6whl4q7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm