北邮复试刷题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;
    }
}
相关推荐
BestandW1shEs1 分钟前
彻底理解消息队列的作用及如何选择
java·kafka·rabbitmq·rocketmq
爱吃烤鸡翅的酸菜鱼4 分钟前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
码蜂窝编程官方7 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
Viktor_Ye23 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm25 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
一二小选手30 分钟前
【Maven】IDEA创建Maven项目 Maven配置
java·maven
J老熊35 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
猿java40 分钟前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试
AuroraI'ncoding42 分钟前
时间请求参数、响应
java·后端·spring
所待.3831 小时前
JavaEE之线程初阶(上)
java·java-ee