面试算法44:二叉树中每层的最大值

news2025/1/29 18:15:30

题目

输入一棵二叉树,请找出二叉树中每层的最大值。例如,输入图7.4中的二叉树,返回各层节点的最大值[3,4,9]。
在这里插入图片描述

分析:用一个队列实现二叉树的广度优先搜索

由于要找出二叉树中每层的最大值,因此在遍历时需要知道每层什么时候开始、什么时候结束。如果还是和前面一样只用一个队列来保存尚未遍历到的节点,那么有可能位于不同的两层的节点同时在队列之中。例如,遍历到节点4时,就把节点4从队列中取出来,此时节点2已经在队列中。接下来要把节点4的两个子节点(节点5和节点1)都添加到队列中。这个时候第2层的节点2和第3层的节点5、节点1都在队列中。

如果不同层的节点同时位于队列之中,那么每次从队列之中取出节点来遍历时就需要知道这个节点位于哪一层。解决这个问题的一个办法是计数。需要注意的是,当遍历某一层的节点时,会将下一层的节点也放入队列中。因此,可以用两个变量分别记录两层节点的数目,变量current记录当前遍历这一层中位于队列之中节点的数目,变量next记录下一层中位于队列之中节点的数目。

解:用一个队列实现二叉树的广度优先搜索

public class Test {
    public static void main(String[] args) {
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node2 = new TreeNode(2);
        TreeNode node5 = new TreeNode(5);
        TreeNode node1 = new TreeNode(1);
        TreeNode node9 = new TreeNode(9);

        node3.left = node4;
        node3.right = node2;
        node4.left = node5;
        node4.right = node1;
        node2.right = node9;

        List<Integer> result = largestValues(node3);
        System.out.println(result);
    }

    public static List<Integer> largestValues(TreeNode root) {
        int current = 0;
        int next = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        if (root != null) {
            queue.offer(root);
            current = 1;
        }

        List<Integer> result = new LinkedList<>();
        int max = Integer.MIN_VALUE;
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            current--;
            max = Math.max(max, node.val);

            if (node.left != null) {
                queue.offer(node.left);
                next++;
            }

            if (node.right != null) {
                queue.offer(node.right);
                next++;
            }

            if (current == 0) {
                result.add(max);
                max = Integer.MIN_VALUE;
                current = next;
                next = 0;
            }
        }

        return result;
    }
}

分析:用两个队列实现二叉树的广度优先搜索

当遍历某一层时,会将位于下一层的子节点也插入队列中,也就是说,队列中会有位于两层的节点。可以用两个不同的队列queue1和queue2分别存放两层的节点,队列queue1中只放当前遍历层的节点,而队列queue2中只放下一层的节点。

当队列queue1被清空时,当前层的所有节点都已经被遍历完。通过比较这一层所有节点的值,就能找出这一层所有节点的最大值。在开始遍历下一层之前,把队列queue1指向队列queue2,并将队列queue2重新初始化为空的队列。重复这个过程,直到所有节点都遍历完为止。

解:用两个队列实现二叉树的广度优先搜索

public class Test {
    public static void main(String[] args) {
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node2 = new TreeNode(2);
        TreeNode node5 = new TreeNode(5);
        TreeNode node1 = new TreeNode(1);
        TreeNode node9 = new TreeNode(9);

        node3.left = node4;
        node3.right = node2;
        node4.left = node5;
        node4.right = node1;
        node2.right = node9;

        List<Integer> result = largestValues(node3);
        System.out.println(result);
    }

    public static List<Integer> largestValues(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        if (root != null) {
            queue1.offer(root);
        }

        List<Integer> result = new LinkedList<>();
        int max = Integer.MIN_VALUE;
        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            max = Math.max(max, node.val);

            if (node.left != null) {
                queue2.offer(node.left);
            }
            if (node.right != null) {
                queue2.offer(node.right);

            }

            if (queue1.isEmpty()) {
                result.add(max);
                max = Integer.MIN_VALUE;

                queue1 = queue2;
                queue2 = new LinkedList<>();
            }
        }

        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1154298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TDengine 受邀参加 CNCC 2023,大会现场展位前“人山人海”!

10 月 26 日-28 日&#xff0c;2023 年度中国计算机大会&#xff08;CNCC 2023&#xff09;在沈阳新世界博览馆成功举办&#xff0c;本届大会以“发展数字基础设施&#xff0c;支撑数字中国建设”作为会议主题&#xff0c;参会规模头一次达到上万人。本届 CNCC 组织了 19 个特邀…

加速软件开发和交付的革命性方法-DevOps

“ 随着信息技术的快速发展&#xff0c;现代软件开发和交付已经经历了巨大的变革。DevOps&#xff08;Development和Operations的结合&#xff09;已经成为这一变革的关键推动力&#xff0c;让开发团队和运维团队之间的界限变得模糊&#xff0c;以加速软件的开发、测试和部署过…

Redis两大持久化方式

Redis具有两种主要的持久化方式&#xff1a;RDB&#xff08;Redis Database Backup&#xff09;和AOF&#xff08;Append-Only File&#xff09;。 1. RDB持久化方式 1.1 RDB概述 RDB&#xff08;Redis Database Backup&#xff09; RDB是Redis进行快照持久化的一种方式。它…

【Javascript】Javascript高级程序设计:dom 随手笔记

文章目录 一、dom 元素类型1.1 Node1.2 document1.3 Element1.4 Text 二、dom 操作2.1 querySelector、querySelectorAll2.2 元素遍历2.3 classList 操作2.4 焦点管理2.5 HTMLDocument 变化2.6 自定义数据属性2.7 插入标记2.7.1 innerHTML2.7.2 outerHTML 2.8 scrollIntoView 三…

【推荐系统】推荐算法:冷启动-召回-粗排-精排-重排 解读

【推荐系统】推荐算法&#xff1a;冷启动-召回-粗排-精排-重排 解读 文章目录 【推荐系统】推荐算法&#xff1a;冷启动-召回-粗排-精排-重排 解读1. 介绍2. 冷启动2.1 用户冷启动2.1.1 利用用户注册信息冷启动2.1.2 好物推荐冷启动2.1.3 问题启发式冷启动2.1.4 社交冷启动2.1.…

Qt程序执行编译输出内容解释

以这个为例&#xff1a; D:\SoftwareInstall\Qt6\Tools\QtCreator\bin\jom\jom.exe -f Makefile.Debug cd AuthorizeTools\ && ( if not exist Makefile D:\SoftwareInstall\Qt6\5.15.2\msvc2019_64\bin\qmake.exe -o Makefile E:\Coding\project\DigitalCamera\digita…

渗透测试流程是什么?这篇给你讲清楚!

在学习渗透测试之初&#xff0c;有必要先系统了解一下它的流程&#xff0c;静下心来阅读一下&#xff0c;树立一个全局观&#xff0c;一步一步去建设并完善自己的专业领域&#xff0c;最终实现从懵逼到牛逼的华丽转变。渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;同时也…

ceph高可用、手动安装

操作系统&#xff1a;centos8 三台服务器&#xff1a; 192.168.6.22&#xff1a;mon,mgr,mds,osd 192.168.6.23&#xff1a;mon,mgr,mds,osd 192.168.6.24&#xff1a;mon,mgr,mds,osd 正式环境osd和mon不应该在一个节点&#xff0c;建议osd单独服务器安装。 ceph版本&am…

python scrapy 报错 DEBUG: Ignoring response 403

DEBUG: Ignoring response <403 https://digital.ucas.com/coursedisplay/results/courses?studyYear2024>: HTTP status code is not handled or not allowed原因&#xff1a;被屏蔽了&#xff0c;在settings.py 里面配一下USER_AGENT&#xff08;随便写一个就行&#…

历年上午真题笔记(2014年)

解析:A 网络设计的三层模型 : 接入层:Layer 2 Switching,最终用户被许可接入网络的点,用户通过接入层可以访问网络设备。 汇聚层:Layer2/3 Switching,访问层设备的汇聚点,负责汇接配线单元,利用二、三层技术实现工作组分段及网络故障的隔离,以免对核心层网络设备造…

A股风格因子看板 (2023.10 第13期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第13期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…

第3天:基础入门-抓包amp;封包amp;协议amp;APPamp;小程序amp;PC应用amp;WEB应用

第3天&#xff1a;基础入门-抓包&封包&协议&APP&小程序&PC应用&WEB应用 1、抓包技术应用意义//有些应用或者目标是看不到的&#xff0c;这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http&#xff0c;socket 4、抓包技…

MaxEnt(最大熵)模型使用方法-系统教程

MaxEnt模型是通过物种已知分布数据和相关环境变量来推算物种的生态需求&#xff0c;然后将运算结果投射至不同的空间和时间中以预测物种的潜在分布区。由于对样本需求量要求小、预测能力优等特点&#xff0c;已被广泛应用于物种潜在分布区预测、外来入侵物种风险评估及气候变化…

11月17号|Move生态Meetup相约浪漫土耳其

Move是基于Rust编程语言&#xff0c;由Mysten Labs联合创始人兼CTO Sam Blackshear在Meta的Libra项目中开发而来&#xff0c;旨在为开发者提供比现有区块链语言更通用的开发语言。Sam的目标是创建Web3的JavaScript&#xff0c;即一种跨平台语言&#xff0c;使开发人员能够在多个…

希尔顿集团飞猪旗舰店携海外酒店开启双11全球旅行囤货潮

【中国&#xff0c;上海&#xff0c;10月31日】继十一黄金周出游需求释放&#xff0c;旅游市场回归超预期&#xff0c;希尔顿集团洞悉旅行者们对于探索目的地的热情不减&#xff0c;于今日在希尔顿集团飞猪旗舰店正式上线2023年双11系列活动&#xff0c;并首次布局海外酒店&…

【Linux】进程状态与进程优先级及其相关概念

文章目录 进程基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类 组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程-fork初识fork原理fork做了什么?fork是如何看待进程的fork如何理解两个返回值的功能 进程状态进程状态&#xff1a;1.普遍的操作…

原来低代码开发如此简单

目录 一、技术介绍 二、设计原理 三、界面展示 四、功能框架 我们在低代码领域探索了多年&#xff0c;从2014 开始研发低代码前端渲染&#xff0c;从 2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF快速开发平台。 JNPF低代码是一款新奇、实用、高效的企业级软件开发…

Jmeter(二十):jmeter对图片验证码的处理(超详细)

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 同时&#xff0c;我也准…

微波上下变频装置系列-80704A/80705A/80719/80720 上下变频装置

微波上下变频装置系 80704A/80705A/80719/80720 上下变频装置系列产品采用1U高度19英寸标准机箱结构&#xff0c;内置低相噪合成本振源&#xff0c;基于模块化可程控的微波上下变频通道&#xff0c;具有结构紧凑、操作简便、技术指标高和环境适应性强等特点。上下变频装置系列的…

2023 年 Github 万圣节彩蛋

目录 2023 万圣节彩蛋2022 万圣节彩蛋2021 万圣节彩蛋2020 万圣节彩蛋 &#x1f383;&#x1f383;&#x1f383; 记录每年 Github 万圣节彩蛋&#xff0c;也记录有来项目成长历程。 Github 主页&#xff1a; https://github.com/haoxianrui 2023 万圣节彩蛋 2022 万圣节彩蛋 …