从上到下打印二叉树 III(中等难度)

简介: 从上到下打印二叉树 III(中等难度)

目录

题目概述(中等难度)

思路与代码

思路展现

方法1 层序遍历 + 双端队列

代码示例

方法2 层序遍历 + 倒序

代码示例

题目概述(中等难度)



题目链接:

点我进入链接


思路与代码

思路展现

方法1 层序遍历 + 双端队列

这块直接看K神题解就好,链接放到这里了:

戳我戳我

个人认为双端队列是需要掌握的,而且有了前面两道题目的铺垫,建议这道题目直接看代码就能理解K神的意思了.


代码示例

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
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()) {
            //定义一个双端队列
            LinkedList<Integer> list = new LinkedList<>();
            //注意这块的循环必须这样写
            for(int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                if(res.size() % 2 == 0) {
                    //偶数层,使用addLast方法放到队列头部
                    list.addLast(node.val);
                }else {
                    //奇数层,使用addFirst方法放到队列尾部
                    list.addFirst(node.val);
                }
                if(node.left != null) {
                   queue.add(node.left);
                }
                if(node.right != null) {
                   queue.add(node.right);
                }             
            }
        res.add(list);
        }
    return res;
    }
}

2.png


方法2 层序遍历 + 倒序

这个方法跟我当时自己想的一样,奈何我根本不知道集合中的元素竟然还有反转方法,的确是骚.使用Collections.reverse()方法即可。

代码示例

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
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> list = new ArrayList<>();
            //注意这块的循环必须这样写
            for(int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                list.add(node.val);
                if(node.left != null) {
                   queue.add(node.left);
                }
                if(node.right != null) {
                   queue.add(node.right);
                }             
            }
            if(res.size() % 2 == 1) {
                //奇数层直接使用reverse方法反转
                Collections.reverse(list);
            }
            res.add(list);
        }
    return res;
    }
}


2.png


相关文章
|
8月前
|
算法
循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例(一)
本文介绍了编程中的一种思想,通过菱形打印问题来阐述如何理解和使用循环嵌套。文章提到,初学者在面对循环结构时,可以通过先识别代码块的结束括号来理解整体结构,提高阅读效率。作者提出了“在盒子里过家家”的理解思路,将外层循环看作一个个盒子,内层循环视为盒子里的操作,弱化循环嵌套的概念,强调以盒子为单位思考问题。此外,文章还通过示例解释了内外循环的关系,帮助读者更好地理解循环控制和执行过程。
120 3
|
8月前
|
算法
循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例(二)
本文介绍了如何运用特定思路解析和解决编程问题,特别是涉及双层循环的情况。首先,通过一个打印特定图案的例子,解释了将“盒子”作为思考单位的概念,即分析问题中每个循环的作用和内容。接着,以冒泡排序为例,展示了如何将问题分解为外层循环(趟数)和内层循环(每趟的比较与交换),并通过盒子思路简化理解和实现代码。最后,提到了菱形打印的代码优化,鼓励读者思考并应用这种思维方式。总的来说,文章强调了自然地理解和运用循环结构,而不是机械地记忆。
86 2
|
算法
删除链表中间节点(变形题目,简单难度)
删除链表中间节点(变形题目,简单难度)
97 1
删除链表中间节点(变形题目,简单难度)
从上到下打印二叉树(简单难度)
从上到下打印二叉树(简单难度)
56 0
从上到下打印二叉树(简单难度)
从上到下打印二叉树 II(简单难度)
从上到下打印二叉树 II(简单难度)
82 0
从上到下打印二叉树 II(简单难度)
|
算法
二叉树中和为某一值的路径(中等难度)
二叉树中和为某一值的路径(中等难度)
91 0
二叉树中和为某一值的路径(中等难度)
从前序与中序遍历序列构造二叉树(中等难度)
从前序与中序遍历序列构造二叉树(中等难度)
108 0
从前序与中序遍历序列构造二叉树(中等难度)
树的子结构(中等难度,好题目)
树的子结构(中等难度,好题目)
107 0
树的子结构(中等难度,好题目)
二叉搜索树的后序遍历序列(中等难度)
二叉搜索树的后序遍历序列(中等难度)
98 0
二叉搜索树的后序遍历序列(中等难度)