zoukankan      html  css  js  c++  java
  • 剑指 Offer 32

    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

    例如:
    给定二叉树: [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7

    返回其层次遍历结果:

    [
      [3],
      [20,9],
      [15,7]
    ]

    方法三:层序遍历 + 倒序
    此方法的优点是只用列表即可,无需其他数据结构。
    偶数层倒序: 若 res 的长度为 奇数 ,说明当前是偶数层,则对 tmp 执行 倒序 操作。
    复杂度分析:
    时间复杂度 O(N)O(N) : NN 为二叉树的节点数量,即 BFS 需循环 NN 次,占用 O(N)O(N) 。共完成 少于 NN 个节点的倒序操作,占用 O(N)O(N) 。
    空间复杂度 O(N)O(N) : 最差情况下,即当树为满二叉树时,最多有 N/2N/2 个树节点同时在 queue 中,使用 O(N)O(N) 大小的额外空间。

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            Queue<TreeNode> queue = new LinkedList<>();
            List<List<Integer>> res = new ArrayList<>();
            if(root != null) queue.add(root);
            while(!queue.isEmpty()) {
                List<Integer> tmp = new ArrayList<>();
                for(int i = queue.size(); i > 0; i--) {
                    TreeNode node = queue.poll();
                    tmp.add(node.val);
                    if(node.left != null) queue.add(node.left);
                    if(node.right != null) queue.add(node.right);
                }
                if(res.size() % 2 == 1) Collections.reverse(tmp);
                res.add(tmp);
            }
            return res;
        }
    }
  • 相关阅读:
    小程序左滑删除之<movable-area/>实现
    小程序省市区县分割
    小程序自定义底部按钮适配Iphone X
    小程序处理图片加载失败的问题
    Notepad++ 使用技巧
    IDEA 在打包项目时遇到的ERROR
    Markdown学习
    Ubuntu操作系统(文件传输)
    数据 恢复----判断Raid盘序及校验方向
    数据恢复----重组raid5解析
  • 原文地址:https://www.cnblogs.com/kpwong/p/14689311.html
Copyright © 2011-2022 走看看