刷算法Leetcode---8(二叉树篇)(层序遍历)

前言

        本文是跟着代码随想录的二叉树顺序进行刷题并编写的 代码随想录

        二叉树的题目较多,就多分了几次写,这是第二篇

        第一篇二叉树的文章链接:刷算法Leetcode---7(二叉树篇)(前中后序遍历)

        这是力扣刷算法的其他文章链接:刷算法Leetcode文章汇总

二叉树篇(层序遍历)

(1)102. 二叉树的层序遍历 

        ①bfs+队列,每层队列大小代表该层总节点数,每次取出一层的节点取值并加入左右孩子

        ②dfs,根节点从第0层开始,递归每个节点的左右孩子和层数,将层数作为下标加入结果。层数大于res的大小时,代表该层是第一次遍历到,要new ArrayList<>()加入res中

class Solution {private List<List<Integer>> res;public List<List<Integer>> levelOrder(TreeNode root) {res = new ArrayList<>();dfs(root,0);return res;}private void dfs(TreeNode node,int depth){if(node==null)return;if(depth>=res.size())res.add(new ArrayList<>());res.get(depth).add(node.val);dfs(node.left,depth+1);dfs(node.right,depth+1);}
}

(2)107. 二叉树的层序遍历 II

        ①bfs+队列,同102题,可直接将结果翻转,或者将每层结果level逆序加入res即可,res.add(0,level)

        ②dfs,同102题,可直接将结果翻转,或者遇到新层时头插res,层数作为逆序下标

(3)199. 二叉树的右视图 

        ①bfs+队列,同102题,在获取每层节点时,只记录最后一个节点

        ②dfs,同102题,每次递归左右节点和层数,层数作为下标,若遇到同层节点就替换,否则直接添加

        ③dfs,大致同102题,但是先递归右节点再递归左节点,若遇到同层则忽略,否则直接添加

class Solution {private List<Integer> res;public List<Integer> rightSideView(TreeNode root) {res = new ArrayList<>();dfs(root,0);return res;}private void dfs(TreeNode node,int depth){if(node==null)return;if(res.size()<=depth)res.add(node.val);dfs(node.right,depth+1);dfs(node.left,depth+1);}
}

(4)637. 二叉树的层平均值

        ①bfs+队列,同102题,记录每层节点数和总和,将平均值加入结果

        ②dfs,同102题,使用sum和count两个ArrayList记录每层的总和与个数,注意sum进行add时要用1.0乘

class Solution {private List<Double> res;private List<Double> sum;private List<Integer> count;public List<Double> averageOfLevels(TreeNode root) {res = new ArrayList<>();sum = new ArrayList<>();count = new ArrayList<>();dfs(root,0);for(int i=0;i<sum.size();i++){res.add(sum.get(i)/count.get(i));}return res;}private void dfs(TreeNode node,int depth){if(node==null)return;if(depth<sum.size()){sum.set(depth,sum.get(depth)+node.val);count.set(depth,count.get(depth)+1);}else{sum.add(1.0*node.val);count.add(1);}dfs(node.left,depth+1);dfs(node.right,depth+1);}
}

(5)429. N 叉树的层序遍历

        bfs+队列,同102题,但不是添加左右孩子,而是遍历添加所有的孩子节点,可用增强for循环

class Solution {private List<List<Integer>> res;private List<Integer> level;private Deque<Node> queue;public List<List<Integer>> levelOrder(Node root) {res = new ArrayList<>();queue = new ArrayDeque<>();if(root==null)return res;queue.addLast(root);while(!queue.isEmpty()){int num = queue.size();level = new ArrayList<>();for(int i=0;i<num;i++){Node temp = queue.pollFirst();level.add(temp.val);for(Node child:temp.children){queue.addLast(child);}}res.add(level);}return res;}
}

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

        ①bfs+队列,同102题,遍历每层节点时记录最大值

        ②dfs,同102题,遇到同层取更大值

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

        ①bfs+队列,同102题,遍历每层除最后一个节点外,next指针指向队头节点,即同层下一个节点

        ②dfs,同102题,遇到同层先将next指针指向新节点,再记录新节点

        ③bfs+next指针迭代,使用两个指针node1和node2实现,node1记录下一层最左节点用于标记下一层,node2遍历当前层,实现每个节点左右子节点的next连接,以及node2右节点和node2的next节点的左节点next连接。利用已有节点的next指针实现对一个层的遍历

class Solution {public Node connect(Node root) {if(root==null)return root;Node node1=root,node2=null;while(node1!=null&&node1.left!=null){node2=node1;node1=node1.left;while(node2!=null){node2.left.next=node2.right;if(node2.next!=null)node2.right.next=node2.next.left;node2=node2.next;}    }return root;}
}

        ④bfs+next指针递归,同上一种方法,使用递归实现

class Solution {public Node connect(Node root) {if(root==null)return root;bfs(root);return root;}private void bfs(Node node){if(node==null||node.left==null)return;Node temp = node;while(temp!=null){temp.left.next=temp.right;if(temp.next!=null)temp.right.next=temp.next.left;temp=temp.next;}bfs(node.left);}
}

        ⑤dfs,对每个节点,只用连接左右子节点和next的子节点即可,再递归左右子节点完成整颗树的连接

class Solution {public Node connect(Node root) {if(root==null||root.left==null)return root;root.left.next=root.right;root.right.next=root.next!=null?root.next.left:null;connect(root.left);connect(root.right);return root;}
}

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

        ①bfs+队列,同116题方法一

        ②dfs,同116题方法二

        ③bfs+next指针迭代,使用nextLeftNode、currNode、preNode三个指针,nextLeftNode为下一层虚拟头节点标识下一层,currNode遍历当前层,preNode为下一层已遍历的最右边节点(便于下一层next指针连接)。遍历一层时,对于每个节点的左右子节点,进行preNode的next指针连接并更新。使用nextLeftNode虚拟头节点便于判断是否还有下一层并初始化preNode

class Solution {public Node connect(Node root) {if (root == null) return null;Node nextLeftNode = null, currNode = root, preNode = null;while (currNode!=null) { // 每层nextLeftNode = new Node(0); // 下一层的虚拟头节点preNode = nextLeftNode;while (currNode != null) { // 遍历当前层if(currNode.left!=null){preNode.next=currNode.left;preNode=preNode.next;}if(currNode.right!=null){preNode.next=currNode.right;preNode=preNode.next;}currNode = currNode.next;}currNode=nextLeftNode.next;}return root;}
}

(9)104. 二叉树的最大深度

        ①bfs+队列,同102题,每遍历一层记录一次

        ②dfs,递归左右节点,取层数更大的

class Solution {public int maxDepth(TreeNode root) {if(root==null)return 0;int left = maxDepth(root.left);int right = maxDepth(root.right);return Math.max(left,right)+1;}
}

(10)111. 二叉树的最小深度

        ①bfs,同102题,遇到叶子节点就返回层数

class Solution {private Deque<TreeNode> queue;private int res;public int minDepth(TreeNode root) {if(root==null)return 0;queue = new ArrayDeque<>();queue.addLast(root);while(!queue.isEmpty()){int num = queue.size();res+=1;for(int i=0;i<num;i++){TreeNode temp = queue.pollFirst();if(temp.left==null&&temp.right==null)return res;if(temp.left!=null)queue.addLast(temp.left);if(temp.right!=null)queue.addLast(temp.right);}}return res;}
}

        ②dfs递归,若左右都不为零,则取最小加一,否则(即左右至少空一个)取不为零加一

class Solution {public int minDepth(TreeNode root) {if(root==null)return 0;int left = minDepth(root.left);int right = minDepth(root.right);if(left!=0&&right!=0)return Math.min(left,right)+1;return left!=0?left+1:right+1;}
}

二叉树篇(层序遍历)总结

        ①bfs+队列,可通过队列大小获取每层节点数

        ②dfs,递归每个节点的层数进行记录,根据题目需要设定根节点的层数为0还是1

        ③对于116和117题,可使用next指针进行一层遍历,同时要记录下一层位置和next连接节点

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

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

相关文章

超实用的VS Code插件推荐

VS Code代码编辑器中提供了丰富的插件&#xff0c;满足不同开发者的需求。这里为大家推荐一些强大的VS Code插件&#xff0c;帮助你打造一个个性化的开发环境&#xff0c;让你的编码体验更加舒适和高效。 打开扩展模块&#xff0c;输入安装包名称&#xff0c;回车进行搜索&…

【WSL】常用命令

文章目录 启动 WSL列出 Linux 发行版安装 Linux 发行版设置默认的 Linux 发行版卸载 Linux 发行版更新 WSL检查 WSL 状态启动和关闭 WSL跨系统文件访问其他命令 Windows Subsystem for Linux (WSL) 提供了一系列命令用于管理 Linux 发行版在 Windows 系统中的运行。下面是一些常…

【Qt之·类QVariant·数据类型】

系列文章目录 文章目录 前言一、概述二、操作及用法1.1 存储数据1.2 获取数据1.3 设置数据1.4 数据类型判断1.5 判断数据是否有效 三、实例演示总结 前言 QVariant是Qt开发中非常重要的一部分&#xff0c;它是Qt的一个核心类&#xff0c;用于处理不同数据类型之间的转换和传递。…

微服务框架Kratos学习笔记

环境配置 export GOPROXYhttps://goproxy.cn export GO111MODULEon go get -u github.com/go-kratos/kratos/tool/kratoskratos 工具安装完成 使用kratos命令创建新项目 kratos new kratos-demo看到这个提示&#xff0c;项目创建完成 go mod tidy 拉取项目依赖 生成所有pro…

保险研究期刊

《保险研究》创刊于1980年&#xff0c;是国家金融监督管理总局主管的学术性保险期刊&#xff0c;是中国保险学会会刊&#xff0c;是中文社会科学引文索引&#xff08;CSSCI&#xff09;来源期刊、中文核心期刊、中国人文社会科学核心期刊、人大“复印报刊资料”重要转载来源期刊…

二、从多臂老虎机看强化学习

二、从多臂老虎机看强化学习 2.1 多臂老虎机问题2.1.1 问题定义2.2.2 问题建模2.2.3 累积懊悔2.2.4 估计期望奖励 2.2 强化学习中的探索与利用平衡2.3 贪心策略2.4 上置信界算法2.5 汤普森采样算法 2.1 多臂老虎机问题 2.1.1 问题定义 在多臂老虎机(mutil-armed bandit, MAB)问…

科研绘图系列:R语言点数图(dot plot)

介绍 点数图(Dot Plot)是一种数据可视化方法,它通过在坐标轴上放置点来展示数据。每个点代表一个数据项,点的位置通常对应于数据值的大小。点数图可以有效地展示多个类别或组的数值比较,使得观察者能够快速识别出哪些类别的数值较高或较低。 加载R包 library(tidyverse…

离线升级docker中的某个镜像——以etcd为例

之前有个项目的程序统一在docker中运行&#xff0c;最近在做安全检查时&#xff0c;发现docker的部分image因为版本没有更新到最新而出现安全漏洞问题。 本贴记录linux环境中&#xff0c;升级docker中某个镜像的步骤&#xff0c;详情如下&#xff1a; 一、生成镜像的步骤&…

ES集成到ambari中出现的常见问题归总

1.elasticesearch用户名组的问题 KeyError: uelasticsearch Error: Error: Unable to run the custom hook script [/usr/bin/python, /var/lib/ambari-agent/cache/stack-hooks/before-ANY/scripts/hook.py, ANY, /var/lib/ambari-agent/data/command-102.json, /var/lib/amb…

Vue 邮箱登录界面

功能 模拟了纯前端的邮箱登录逻辑 还没有连接后端的发送邮件的服务 后续计划&#xff0c;再做一个邮箱、密码登录的界面 然后把这两个一块连接上后端 技术介绍 主要介绍绘制图形人机验证乃个 使用的是canvas&#xff0c;在源码里就有 界面控制主要就是用 表格、表单&#x…

常见的希腊字符及其表示方法

在 Python 中&#xff0c;可以通过使用 Unicode 字符、LaTeX 表示法或符号库&#xff08;如 SymPy&#xff09;来表示各种希腊字符。以下是常见的希腊字符及其表示方法&#xff1a; 常见的希腊字符及其 Unicode 字符名称Unicode 名称UnicodeΑAlpha (大写)GREEK CAPITAL LETT…

大量设备如何集中远程运维?用好向日葵的这几个功能很重要

当企业的业务不断发展&#xff0c;不同系统、不同用途的IT设备数量也会不断上升&#xff0c;面对不断扩张的设备规模&#xff0c;IT运维的压力自然也会陡然上升。 面对这种情况&#xff0c;传统的线下运维方式已经不再合适&#xff0c;我们需要引入一个专业的&#xff0c;可以…

SRC实战:无中生有的接口和参数

今天分享的这个漏洞怎么说呢&#xff0c;虽然也是个高危&#xff0c;但是其实挺简单的&#xff0c;一个很eazy的越权&#xff0c;但是我觉得多多少少还是有点意思吧。 0x00 这是一个移动端的应用程序&#xff0c;前面比较常规&#xff0c;模拟器 BP&#xff0c;跑了一下所有…

Linux RHEL 8.6在安装PostgreSql时提示缺少en_US.UTF-8

解释&#xff1a; 这个报错通常表示在Linux RHEL 8.6系统上&#xff0c;系统本身没有安装英文&#xff08;美国&#xff09;的UTF-8编码字符集。UTF-8是一种对Unicode字符集进行编码的方式&#xff0c;它被广泛用于支持各种语言的字符显示。 解决方法&#xff1a; 安装英文UT…

赋能心理大模型,景联文科技推出高质量心理大模型数据库

生成式大模型作为当前发展势头最为强劲的人工智能前沿技术&#xff0c;其在临床心理学领域中的创新应用已成为社会关注和医学聚焦的热点之一。 心理大模型在落地应用过程中可能面临的痛点主要包括以下几个方面&#xff1a; 数据隐私与安全&#xff1a;确保敏感的个人信息在模型…

【Java11】变量的初始化和内存中的运行机制

成员变量的初始化和内存中的运行机制 系统加载类或创建类的实例时&#xff0c;系统自动为成员变量分配内存空间&#xff0c;然后自动为成员变量指定初始值。 class Person {public String name; // 实例变量public static int eyeNum; // 类变量 }var p1 Person(); var p2 …

第9篇 区块链安全性:理解和应对常见攻击方式

亲爱的读者,欢迎来到《区块链常识:从小白到顶级行业专家》的第9章。今天,我们将一起探索区块链世界的黑暗面——安全性问题。在这个章节中,我会用最简单的语言和最生动的例子,带你了解一些常见的区块链攻击方式,并教你如何应对它们。 51%攻击 想象一下,如果你的学校里…

2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析

2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析 解题方法&#xff1a; 首先就是对数据进行数据的预处理包括缺失值和异常值处理&#xff0c;之后就是分析哪些指标与洪水的发生有着密切的关联&#xff0c;可以使用相关性分析&#xff08;建议使用斯皮尔…

什么是OSPFv2 ?

什么是OSPF ? 开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用的是OSPF Version 2&#xff08;RFC2328&#xff09;&a…

PHP框架Symfony详解

Symfony 是一个用PHP语言编写的开放源代码的Web应用框架&#xff0c;旨在加速Web应用程序的开发过程&#xff0c;提高代码的可维护性和可扩展性。以下是对Symfony框架的详细解析&#xff1a; 一、框架概述 1. 起源与开发者 Symfony由SensioLabs&#xff08;现为Symfony公司&…