[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III相关的知识,希望对你有一定的参考价值。

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

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

    3
   / \\
  9  20
    /  \\
   15   7

返回其层次遍历结果:

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

提示:

  • 节点总数 <= 1000

题解一:

层序遍历 + 双端队列:利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:

  • 奇数层则添加至 tmp 尾部
  • 偶数层则添加至 tmp 头部
	/**
     * 剑指 Offer 32 - III. 从上到下打印二叉树 III
     */
    public List<List<Integer>> levelOrder(TreeNode root) 
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if (root != null) 
            queue.offer(root);
        

        while (!queue.isEmpty()) 
            // 临时集合,存储当前层的遍历结果
            LinkedList<Integer> tmp = new LinkedList<>();
            // 遍历当前层的所有节点
            for (int i = queue.size(); i > 0; i--) 
                TreeNode node = queue.poll();
                // 偶数层,从右往左打印
                if (res.size() % 2 == 0) 
                    tmp.addLast(node.val);
                 else 
                    // 奇数层,从左往右打印
                    tmp.addFirst(node.val);
                

                // 将其左、右孩子加入到队列尾
                if (node.left != null) 
                    queue.add(node.left);
                
                if (node.right != null) 
                    queue.add(node.right);
                
            
            res.add(tmp);
        

        return res;
    

题解二:

	/**
     * 剑指 Offer 32 - III. 从上到下打印二叉树 III
     */
    public List<List<Integer>> levelOrder(TreeNode root) 
        List<List<Integer>> res = new ArrayList<>();
        // 双端队列
        Deque<TreeNode> deque = new LinkedList<>();
        if (root != null) 
            deque.add(root);
        

        while (!deque.isEmpty()) 
            List<Integer> tmp = new ArrayList<>();
            // 从左至右打印奇数层所有结点
            for (int i = deque.size(); i > 0; i--) 
                TreeNode node = deque.removeFirst();
                tmp.add(node.val);
                // 从左至右加入下层结点
                if (node.left != null) 
                    deque.addLast(node.left);
                
                if (node.right != null) 
                    deque.addLast(node.right);
                
            
            res.add(tmp);

            // 为空则提前结束
            if (deque.isEmpty()) 
                break;
            

            tmp = new ArrayList<>();
            // 从右往左打印偶数层所有结点
            for (int i = deque.size(); i > 0; i--) 
                TreeNode node = deque.removeLast();
                tmp.add(node.val);
                // 从右往左加入下层结点
                if (node.right != null) 
                    deque.addFirst(node.right);
                
                if (node.left != null) 
                    deque.addFirst(node.left);
                
            
            res.add(tmp);
        

        return res;
    

题解三:

	/**
     * 剑指 Offer 32 - III. 从上到下打印二叉树 III
     */
    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;
    

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof

以上是关于[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III的主要内容,如果未能解决你的问题,请参考以下文章

leetcode剑指 Offer 66. 构建乘积数组

LeetCode 剑指Offer 15[位运算] 二进制中1的个数 HERODING的LeetCode之路

LeetCode1482. 制作 m 束花所需的最少天数 / 剑指 Offer 32 . 从上到下打印二叉树I/II/III

LeetCode剑指 Offer II 069. 山峰数组的顶部(C++)

LeetCode剑指 Offer(27)

剑指Offer32,从上到下打印二叉树