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;
        }
    }
  • 相关阅读:
    nginx 相关命令
    uni-app跨域解决
    vue-cli3.0的项目搭建
    vue.js
    Flex布局
    javascript 数组排重
    IE的hack问题浅谈
    div自身高度、屏幕高度
    bootstrap轮播和百叶窗
    面向对象
  • 原文地址:https://www.cnblogs.com/kpwong/p/14689311.html
Copyright © 2011-2022 走看看