【Leetcode】102. 二叉树的层次遍历

news/2023/12/1 11:03:26 标签: 数据结构与算法

题目

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

题解

我们数据结构的书上教的层序遍历,就是利用一个队列,不断的把左子树和右子树入队。但是这个题目还要要求按照层输出。所以关键的问题是: 如何确定是在同一层的
我们很自然的想到:
如果在入队之前,把上一层所有的节点出队,那么出队的这些节点就是上一层的列表。
由于队列是先进先出的数据结构,所以这个列表是从左到右的。

/**
 * 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) {
        List<List<Integer>> res = new LinkedList<>();
        if (root == null) {
            return res;
        }

        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            List<Integer> currentRes = new LinkedList<>();
            // 当前队列的大小就是上一层的节点个数, 依次出队
            while (size > 0) {
                TreeNode current = queue.poll();
                if (current == null) {
                    continue;
                }
                currentRes.add(current.val);
                // 左子树和右子树入队.
                if (current.left != null) {
                    queue.add(current.left);
                }
                if (current.right != null) {
                    queue.add(current.right);
                }
                size--;
            }
            res.add(currentRes);
        }
        return res;
    }
}

这道题可不可以用非递归来解呢?

递归的子问题:遍历当前节点, 对于当前层, 遍历左子树的下一层层,遍历右子树的下一层

递归结束条件: 当前层,当前子树节点是null

/**
 * 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) {
        List<List<Integer>> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        levelOrderHelper(res, root, 0);
        return res;
    }

    /**
     * @param depth 二叉树的深度
     */
    private void levelOrderHelper(List<List<Integer>> res, TreeNode root, int depth) {
        if (root == null) {
            return;
        }
        
        if (res.size() <= depth) {
            // 当前层的第一个节点,需要new 一个list来存当前层.
            res.add(new LinkedList<>());
        }
        // depth 层,把当前节点加入
        res.get(depth).add(root.val);
        // 递归的遍历下一层.
        levelOrderHelper(res, root.left, depth + 1);
        levelOrderHelper(res, root.right, depth + 1);
    }
}

热门阅读

  • 技术文章汇总
  • 【Leetcode】101. 对称二叉树
  • 【Leetcode】100. 相同的树
  • 【Leetcode】98. 验证二叉搜索树

Leetcode名企之路


http://www.niftyadmin.cn/n/1202853.html

相关文章

Go语言中DateTime知识点

一、基本使用 ①从属于time这个包 ②一般使用都是使用 time.Time 这个类型表示时间 &#xff0c;time包中还有一些常量&#xff0c;源码如下 // Common durations. There is no definition for units of Day or larger // to avoid confusion across daylight savings time zon…

相关JQuery函数封装

在web开发过程中&#xff0c;有些时候任务重&#xff0c;事情多&#xff0c;很多动画效果大多不会再自己来实现&#xff0c;大部分都会使用自己曾经已经做好的动画效果。而为了使用起来快捷&#xff0c;大多都会将动画效果封装为函数&#xff0c;想要动画效果时便调用该动画效果…

攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗

AI技术的发展为网络安全带来新机遇的同时&#xff0c;黑客也在逐渐利用AI漏洞建立对抗样本以躲避攻击&#xff0c;双方在各自领域的更多尝试也将是AI技术发展的一场新博弈。那么&#xff0c;在应用中&#xff0c;如何利用AI检测技术与恶意软件展开对抗&#xff1f; 腾讯安全技术…

关于Ajax

Ajax(Asynchronous Javascript And XML)是做一个请求&#xff0c;同时利用JS的一个内置对象XHR来实现&#xff0c;因此&#xff0c;Ajax和Jquery一样&#xff0c;并不是一门新的语言。只是通过Ajax,可以从服务器请求数据&#xff0c;将数据动态的渲染到页面上。说到服务器&…

全新版本仿网易云音乐来啦

前言 在前端技术领域中&#xff0c;我们可以切身感受得到技术的更新、变革的速度是非常快的&#xff0c;所以工程师们都会需要时常关注和学习一些新技术、新标准。 因为在工作中负责项目的技术栈相比于业界来说&#xff0c;算比较落后了&#xff0c;所以自己动手来开发一个音乐…

HTML5的相关内容

随着技术的不断发展&#xff0c;如今HTML已经发展到了H5&#xff0c;HTML5新增的标签使得开发人员节省了很多代码量、工作量。虽然目前&#xff0c;很多浏览完还未完全兼容适应H5&#xff0c;但现在&#xff0c;几乎每人人手一部手机或是Ipad&#xff0c;而HTML5也广泛的适用于…

【ocp-12c】最新Oracle OCP-071考试题库(41题)

41、(8-14) choose two View the Exhibit and examine the structure of the ORDERS table. The columns ORDER_MODE and ORDER_TOTAL have the default values direct and 0 respectively. Which two INSERT statements are valid? (Choose two.) A) INSERT INTO (SELECT ord…

移动端web开发

如今&#xff0c;走在路上&#xff0c;望一望四周均会发现&#xff0c;十个人当中有九个是低头族。科技的发展改善了人们的生活品质&#xff0c;手机由曾经的老人机、按键机到如今的智能手机&#xff0c;还有即将普及的全面屏时代。手机的普及&#xff0c;手机APP也随着盛行&am…

java中两个Integer类型的值相比较的问题

转载自&#xff1a; https://www.cnblogs.com/xh0102/p/5280032.html 两个Integer类型整数进行比较时&#xff0c;一定要先用intValue()方法将其转换为int数之后再进行比较&#xff0c;因为直接使用比较两个Integer会出现问题。 总结&#xff1a; 当给Integer直接赋值时&#x…

web响应式开发

人们在浏览网页时&#xff0c;不仅仅是使用电脑来浏览&#xff0c;还有些是通过Ipad、手机等设备浏览。而Ipad、电脑、手机的屏幕大小不同且每一款手机、IPad的屏幕也有大小区别&#xff0c;网页在这些设备的显示也必定会有所区别。显而易见&#xff0c;电脑屏幕最大&#xff0…

应用场景以及实践

2019独角兽企业重金招聘Python工程师标准>>> https://www.cnblogs.com/NiceCui/p/7794659.html redis应用场景 转载于:https://my.oschina.net/u/1443466/blog/3015465

web前端开发中关于面向对象(一)

IT专业人员应该都会涉及到一门语言&#xff1a;C语言。C语言中就提到了面向过程和面向对象的思想。面向过程、面向对象的思想不仅仅存在于C语言中&#xff0c;Java、.NET、web前端开发中也存在。那么&#xff0c;web前端开发中&#xff0c;面向对象又是什么&#xff1f;今天&am…

display math in cnblog

$abc$ this is a example \(a\frac{b}{c}\)转载于:https://www.cnblogs.com/code-saturne/p/10447023.html

web前端开发中关于面向对象(二)

各种语言中&#xff0c;面向对象中不可缺少的亦是核心的自然是函数&#xff0c;且该函数不是普通的函数&#xff0c;而是构造函数&#xff0c;是通过关键字new进行实例化出来的。因此&#xff0c;函数的重要性显而易见&#xff0c;故而简单说一说函数。 一、函数的产生方式 1…

Linux计划任务, yum源配置, 用户, sudo, 权限, 软连接, PS1, 压缩, kill, ps, 防火墙

计划任务crond服务 1 查看计划任务的执行&#xff1a;tail -f /var/log/cron2 写计划任务时&#xff0c;命令必须加上绝对路径&#xff0c;否则会出现这种情况&#xff1a;从日志中看&#xff0c;确实触发了计划任务的执行&#xff0c;但是命令却没有执行成功&#xff0c;比如*…

web前端开发中关于面向对象(三)

在面向对象前篇中提到过原型的概念&#xff0c;说到原型&#xff0c;便又延伸出了关于原型的一个知识点——原型链。也许作为一名专业的前端开发人员来说&#xff0c;明白原型链的含义以及用法&#xff0c;但对于前端的爱好者和在校大学生而言&#xff0c;对于原型链的概念可能…
最新文章