目录

102.二叉树的层序遍历

107.二叉树的层次遍历II

199.二叉树的右视图

637.二叉树的层平均值

429.N叉树的层序遍历

515.在每个树行中找最大值

116.填充每个节点的下一个右侧节点指针

117.填充每个节点的下一个右侧节点指针II

104.二叉树的最大深度

111.二叉树的最小深度


参考:代码随想录

102.二叉树的层序遍历

链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

题目:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

题解:队列驱动+逐层收集节点值

 在二叉树遍历中,"迭代法"指的是使用循环结构(如 while/for)和显式的数据结构(如队列) 来实现遍历,而不是通过函数递归调用(递归法)

工作流程

1.在每层开始时:记录队列当前长度len

        这个值就是当前层所有节点的数量,此时队列中的节点全部属于同一层

2.处理当前层:执行len次循环

        每次循环处理一个节点节点出队时,将其子节点加入队列 (这些子节点属于下一层)

3.自然切换层级:当1en减到0时

        当前层所有节点处理完毕,队列中剩下的全是新加入的子节点(即下一层节点),自动切换到下一层的处理

class Solution {public List<List<Integer>> resList = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {checkFun02(root);return resList;}public void checkFun02(TreeNode node) {if (node == null) return;//头出尾入的双端队列Queue<TreeNode> que = new LinkedList<TreeNode>();//根节点入队que.offer(node);//外层循环:处理每一层while (!que.isEmpty()) {//存储当前层所有节点值List<Integer> itemList = new ArrayList<Integer>();//当前层节点的数量int len = que.size();//内层循环:处理当前层所有的节点while (len > 0) {//1.队头出队TreeNode tmpNode = que.poll();//2.记录节点值itemList.add(tmpNode.val);//3.子节点入队(先左后右)if (tmpNode.left != null) que.offer(tmpNode.left);if (tmpNode.right != null) que.offer(tmpNode.right);//当前层节点计数器减去1len--;}//整层节点值存入结果resList.add(itemList);}
}

107.二叉树的层次遍历II

链接:107. 二叉树的层序遍历 II - 力扣(LeetCode)

题目:给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

题解:

public class N0107 {/*** 解法:队列,迭代。* 层序遍历,再翻转数组即可。*/public List<List<Integer>> solution1(TreeNode root) {List<List<Integer>> list = new ArrayList<>();Deque<TreeNode> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {List<Integer> levelList = new ArrayList<>();int levelSize = que.size();for (int i = 0; i < levelSize; i++) {TreeNode peek = que.peekFirst();levelList.add(que.pollFirst().val);if (peek.left != null) {que.offerLast(peek.left);}if (peek.right != null) {que.offerLast(peek.right);}}list.add(levelList);}List<List<Integer>> result = new ArrayList<>();for (int i = list.size() - 1; i >= 0; i-- ) {result.add(list.get(i));}return result;}
}

199.二叉树的右视图

链接:199. 二叉树的右视图 - 力扣(LeetCode)

题目:给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

题解:层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,放入result数组种,随后返回result.

public class N0199 {/*** 解法:队列,迭代。* 每次返回每层的最后一个字段即可。** 小优化:每层右孩子先入队。代码略。*/public List<Integer> rightSideView(TreeNode root) {List<Integer> list = new ArrayList<>();Deque<TreeNode> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {int levelSize = que.size();for (int i = 0; i < levelSize; i++) {TreeNode poll = que.pollFirst();if (poll.left != null) {que.addLast(poll.left);}if (poll.right != null) {que.addLast(poll.right);}if (i == levelSize - 1) {list.add(poll.val);}}}return list;}
}

637.二叉树的层平均值

链接:637. 二叉树的层平均值 - 力扣(LeetCode)

题目:给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

题解:层序遍历的时候把一层求个总和再取个均值。

public class N0637 {/*** 解法:队列,迭代。* 每次返回每层的最后一个字段即可。*/public List<Double> averageOfLevels(TreeNode root) {List<Double> list = new ArrayList<>();Deque<TreeNode> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {int levelSize = que.size();double levelSum = 0.0;for (int i = 0; i < levelSize; i++) {TreeNode poll = que.pollFirst();levelSum += poll.val;if (poll.left != null) {que.addLast(poll.left);}if (poll.right != null) {que.addLast(poll.right);}}list.add(levelSum / levelSize);}return list;}
}

429.N叉树的层序遍历

链接:429. N 叉树的层序遍历 - 力扣(LeetCode)

题目:

        给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

题解:一个节点有多个孩子

public class N0429 {/*** 解法1:队列,迭代。*/public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> list = new ArrayList<>();Deque<Node> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {int levelSize = que.size();List<Integer> levelList = new ArrayList<>();for (int i = 0; i < levelSize; i++) {Node poll = que.pollFirst();levelList.add(poll.val);List<Node> children = poll.children;if (children == null || children.size() == 0) {continue;}for (Node child : children) {if (child != null) {que.offerLast(child);}}}list.add(levelList);}return list;}class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}}
}

515.在每个树行中找最大值

链接:515. 在每个树行中找最大值 - 力扣(LeetCode)

题目:给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

题解:层序遍历,取每层的最大值。

class Solution {public List<Integer> largestValues(TreeNode root) {if(root == null){return Collections.emptyList();}List<Integer> result = new ArrayList();Queue<TreeNode> queue = new LinkedList();queue.offer(root);while(!queue.isEmpty()){int max = Integer.MIN_VALUE;for(int i = queue.size(); i > 0; i--){TreeNode node = queue.poll();max = Math.max(max, node.val);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);}result.add(max);}return result;}
}

116.填充每个节点的下一个右侧节点指针

链接:116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

题目:

       

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

题解:依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了

class Solution {public Node connect(Node root) {Queue<Node> tmpQueue = new LinkedList<Node>();if (root != null) tmpQueue.add(root);while (tmpQueue.size() != 0){int size = tmpQueue.size();Node cur = tmpQueue.poll();if (cur.left != null) tmpQueue.add(cur.left);if (cur.right != null) tmpQueue.add(cur.right);for (int index = 1; index < size; index++){Node next = tmpQueue.poll();if (next.left != null) tmpQueue.add(next.left);if (next.right != null) tmpQueue.add(next.right);cur.next = next;cur = next;}}return root;}
}

117.填充每个节点的下一个右侧节点指针II

链接:117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)

题目:

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

题解:

class Solution {public Node connect(Node root) {Queue<Node> queue = new LinkedList<>();if (root != null) {queue.add(root);}while (!queue.isEmpty()) {int size = queue.size();Node node = null;Node nodePre = null;for (int i = 0; i < size; i++) {if (i == 0) {nodePre = queue.poll(); // 取出本层头一个节点node = nodePre;} else {node = queue.poll();nodePre.next = node; // 本层前一个节点 next 指向当前节点nodePre = nodePre.next;}if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}nodePre.next = null; // 本层最后一个节点 next 指向 null}return root;}
}

104.二叉树的最大深度

链接:104. 二叉树的最大深度 - 力扣(LeetCode)

题目:

        给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

题解:二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大的深度就是二叉树的层数。

class Solution {public int maxDepth(TreeNode root) {if (root == null)   return 0;Queue<TreeNode> que = new LinkedList<>();que.offer(root);int depth = 0;while (!que.isEmpty()){int len = que.size();while (len > 0){TreeNode node = que.poll();if (node.left != null)  que.offer(node.left);if (node.right != null) que.offer(node.right);len--;}depth++;}return depth;}
}

111.二叉树的最小深度

链接:111. 二叉树的最小深度 - 力扣(LeetCode)

题目:

        给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

题解:当左右孩子都为空的时候,说明遍历到最低点了。

class Solution {public int minDepth(TreeNode root){if (root == null) {return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while (!queue.isEmpty()){int size = queue.size();depth++;TreeNode cur = null;for (int i = 0; i < size; i++) {cur = queue.poll();//如果当前节点的左右孩子都为空,直接返回最小深度if (cur.left == null && cur.right == null){return depth;}if (cur.left != null) queue.offer(cur.left);if (cur.right != null) queue.offer(cur.right);}}return depth;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++智能指针详解:告别内存泄漏,拥抱安全高效

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 引言&#xff1a;为什么引入智能指针&#…

算法训练营day57 图论⑦ prim算法精讲、kruskal算法精讲

两种最小生成树算法讲解 prim算法精讲 卡码网53. 寻宝 本题题目内容为最短连接&#xff0c;是最小生成树的模板题&#xff0c;那么我们来讲一讲最小生成树。最小生成树可以使用prim算法也可以使用kruskal算法计算出来。本篇我们先讲解prim算法。 最小生成树是所有节点的最小连…

148-基于Python的2024物流年度销售收入数据可视化分析系统

基于Python Django的物流数据可视化分析系统开发实录 项目背景 随着物流行业数据量的激增&#xff0c;企业对数据分析和可视化的需求日益增长。传统的Excel分析方式难以满足多维度、实时、交互式的数据洞察需求。为此&#xff0c;我们开发了一个基于Python Django的物流年度销售…

Python中的关键字参数:灵活与可读性的完美结合(Effective Python 第23条)

在Python编程中&#xff0c;函数参数的传递方式灵活多样&#xff0c;而其中一种特别强大的方式就是关键字参数。关键字参数不仅能够提升代码的可读性&#xff0c;还为函数的设计和调用提供了极大的便利。本文将深入探讨关键字参数的用法、优势以及实际应用中的注意事项。 一、关…

005.Redis 主从复制架构

主从复制概念与原理 核心概念 主节点&#xff08;Master&#xff09;&#xff1a;唯一接受写操作的节点&#xff0c;数据修改后异步复制到从节点。 从节点&#xff08;Replica&#xff09;&#xff1a;复制主节点数据的节点&#xff0c;默认只读&#xff08;可配置为可写但不…

Android Studio 模拟器 “******“ has terminated 问题

问题&#xff1a;Android Studio 模拟器 "**" has terminated 问题设备信息&#xff1a;CPU:I5 7500U RAM:64GB System:Windows 10 64位解决&#xff1a; 网上所有办法都尝试后仍然不可行可尝试如下办法&#xff1a;1、此电脑→管理→设备管理→显示适配器→右击→…

uniapp 懒加载图片

实现的功能 1.一次性获取图片。 2.按用户视野范围内看到的图片滚动下来进行懒加载,提高浏览器性能。 3.不要一次性加载全部的图片 1.给父组件绑定一个滚动监听 1.页面路径:/pages/Home/index.vue 不在一个页面的话用 EventBus去触发。@scroll="handleScroll2" Ev…

Android - 资源类型 MINE Type

一、概念MINE&#xff08;Multipurpose Internet Mail Extensions&#xff09;最初是为了标识电子邮件附件的类型&#xff0c;在 HTML 中使用 content-type 属性表示&#xff0c;描述了文件类型的互联网标准。格式&#xff1a;媒体类型/子类型&#xff0c;可使用通配符*。如 au…

php8.+ 新函数总结

PHP系统函数是PHP核心提供的内置函数&#xff0c;用于执行常见任务&#xff0c;如字符串操作、数组处理、数学运算等。它们通过预定义代码块封装了特定功能&#xff0c;开发者可直接调用而无需重复编写代码。 而 PHP 8.0以后又新增了一些实用函数&#xff0c;今天总结部分常见的…

Qt事件处理机制详解

一、事件处理基本流程在Qt中&#xff0c;所有从QObject派生的类都能处理事件。事件处理的核心流程如下&#xff1a;事件入口函数&#xff1a;bool QObject::event(QEvent *e)参数e包含事件信息&#xff0c;通过e->type()获取事件类型返回值true表示事件已被处理&#xff0c;…

Zynq中级开发七项必修课-第三课:S_AXI_GP0 主动访问 PS 地址空间

Zynq中级开发七项必修课-第三课&#xff1a;S_AXI_GP0 主动访问 PS 地址空间 目标1.0 编写 AXI-Lite Master&#xff1a;按键计数 → 写入 PS 内存1.1 PL 触发中断 → PS 响应并串口打印按键计数值BD图axi_lite_master.v // // AXI4-Lite Simple Master (single-shot, non-pip…

CVPR | 2025 | MAP:通过掩码自回归预训练释放混合 Mamba - Transformer 视觉骨干网络的潜力

文章目录CVPR | 2025 | MAP&#xff1a;通过掩码自回归预训练释放混合 Mamba - Transformer 视觉骨干网络的潜力创新点初步研究初步结论方法确定一个混合网络方法掩码机制掩码比例MAP的transformer解码器重建目标实验ImageNet-1k 上的 2D 分类CVPR | 2025 | MAP&#xff1a;通过…

Spring Boot + Spring AI 最小可运行 Demo

一. 项目依赖&#xff08;pom.xml&#xff09;<project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/mav…

AI重塑校园教育:中小学AI智慧课堂定制方案+AI作业批改减负,告别一刀切学生进步快

家长们&#xff0c;你有没有听过孩子抱怨上学的烦恼&#xff1f;课堂上老师讲的内容&#xff0c;有的同学觉得太简单 “吃不饱”&#xff0c;有的却跟不上 “听不懂”&#xff1b;放学后作业堆成山&#xff0c;老师要熬夜批改到半夜&#xff0c;错题反馈要等第二天才能拿到&…

旧物循环,交易新生——旧物回收二手交易小程序,引领绿色消费新风尚

在资源日益紧张、环境污染问题日益突出的今天&#xff0c;绿色消费已经成为时代发展的必然趋势。旧物回收二手交易小程序&#xff0c;作为绿色消费的重要载体&#xff0c;正以其独特的优势和魅力&#xff0c;引领着一场关于旧物循环、交易新生的绿色革命。一、旧物循环&#xf…

刷机维修进阶教程-----如何清除云账号 修复wifi 指南针 相机 指纹等刷机故障

在刷机、系统升级或降级过程中,是否遇到过以下问题:WiFi无法开启、相机无响应、指南针或陀螺仪失灵 指纹等故障?另外,云账号是否仍会保留,即使通过9008模式刷机也无法彻底清除?那么这篇博文都可以找到答案。 通过博文了解💝💝💝 1💝💝💝----云账号信息分区如…

AI翻唱实战:用[灵龙AI API]玩转AI翻唱 – 第6篇

历史文章 [灵龙AI API] 申请访问令牌 - 第1篇 [灵龙AI API] AI生成视频API&#xff1a;文生视频 – 第2篇 图生视频实战&#xff1a;用[灵龙AI API]玩转AI生成视频 – 第2篇&#xff0c;从静图到大片 单图特效实战&#xff1a;用[灵龙AI API]玩转AI生成视频 – 第3篇&#…

大模型0基础开发入门与实践:第11章 进阶:LangChain与外部工具调用

第11章 进阶&#xff1a;LangChain与外部工具调用 1. 引言 在上一章&#xff0c;我们成功地创造了我们的第一个“生命”——一个可以对话的机器人。我们为它的诞生而兴奋&#xff0c;但很快我们就会发现它的局限性。它就像一个被囚禁在玻璃房中的天才大脑&#xff0c;拥有渊博…

SQL 日期处理:深入解析与高效实践

SQL 日期处理&#xff1a;深入解析与高效实践 引言 在数据库管理中&#xff0c;日期和时间数据的处理是不可或缺的一部分。SQL&#xff08;结构化查询语言&#xff09;提供了丰富的日期和时间函数&#xff0c;使得对日期的处理变得既灵活又高效。本文将深入探讨SQL日期处理的相…

源代码部署 LAMP 架构

源代码部署 LAMP 架构 &#xff08;Linux Apache MySQL PHP&#xff09; 一、LAMP 架构概述 LAMP 是一套经典的开源 Web 服务架构&#xff0c;通过源代码安装可实现高度定制化&#xff0c;适用于对软件版本、功能模块有特定需求的场景。本指南基于 CentOS 7 系统&#xf…