当前位置: 首页 > news >正文

leetcode刷题 | 关于二叉树的题型总结1

leetcode刷题 | 关于二叉树的题型总结1

文章目录

  • leetcode刷题 | 关于二叉树的题型总结1
    • 题目连接
    • 完全二叉树插入器
    • 在每个树行中找最大值
    • 找树左下角的值
    • 二叉树的右视图
    • 二叉树剪枝

题目连接

919. 完全二叉树插入器 - 力扣(LeetCode)

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

513. 找树左下角的值 - 力扣(LeetCode)

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

814. 二叉树剪枝 - 力扣(LeetCode)

297. 二叉树的序列化与反序列化 - 力扣(LeetCode)

完全二叉树插入器

class CBTInserter {TreeNode root;// 存入不完整结构的节点Deque<TreeNode> deq;public CBTInserter(TreeNode root) {this.root = root;deq = new ArrayDeque();//添加到队列尾部deq.offer(root);while(deq.peek().left != null && deq.peek().right != null){TreeNode temp = deq.poll();deq.offer(temp.left);deq.offer(temp.right);}        }public int insert(int v) {TreeNode node = deq.peek();if(node.left == null) node.left = new TreeNode(v);else{node.right = new TreeNode(v);deq.poll();deq.offer(node.left);deq.offer(node.right);}return node.val;}public TreeNode get_root() {return root;}
}

在每个树行中找最大值

dfs解法,按照中左右顺序遍历

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

层序遍历,层序遍历具有通用性,在之后几道题中都可以这么做

class Solution {  public List<Integer> largestValues(TreeNode root) {List<Integer> res = new ArrayList();Deque<TreeNode> deq = new ArrayDeque();if(root == null) return res;deq.add(root);while(!deq.isEmpty()){int size = deq.size();int temp = Integer.MIN_VALUE;while(size-->0){TreeNode node = deq.poll();temp = Math.max(temp,node.val);if(node.left != null)  deq.add(node.left);if(node.right != null) deq.add(node.right);}res.add(temp);}return res;      }
}

找树左下角的值

class Solution {public int findBottomLeftValue(TreeNode root) {if(root == null) return -1;Deque<TreeNode> deq = new ArrayDeque();deq.add(root);int res = root.val;while(!deq.isEmpty()){int size = deq.size();for(int i = 0;i<size;i++){TreeNode node = deq.poll();if(i == 0) res = node.val;if(node.left !=null) deq.add(node.left);if(node.right != null) deq.add(node.right);}}return res;} 
}

二叉树的右视图

class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null) return res;Deque<TreeNode> deq = new ArrayDeque<>();deq.add(root);while (!deq.isEmpty()){int size = deq.size();for (int i = 0;i<size;i++){TreeNode node = deq.poll();if (i == size-1) res.add(node.val);if (node.left != null) deq.add(node.left);if (node.right != null) deq.add(node.right);}}return res;}
}

二叉树剪枝

递归结束条件:左子树为空,右子树为空,当前节点的值为 0,同时满足时,才表示以当前节点为根二叉树的所有节点都为 0,需要将这棵子树移除,返回空

class Solution {public TreeNode pruneTree(TreeNode root) {if (root == null) return null;root.left = pruneTree(root.left);root.right = pruneTree(root.right);if (root.left == null && root.right == null && root.val == 0) return null;return root;}
}

DFS,从评论区大佬的评论里知道了StringJoiner类,做一个简单的解释

StringJoiner是java.util包下的一个工具类,jdk1.8出来的

作用是在构造字符串时,可以自动添加前缀、后缀及分隔符,而不需要自己去实现这些添加字符的逻辑

StringJoiner sj = new StringJoiner(“,”, “[”, “]”);

代表每一个字符的后缀为,前缀开始为[ , 后缀结束为 ]

如果 sj.add(“1”).add(“2”).add(“3”);

那么toString() 输出:[1,2,3]

import java.util.*;
public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {if (root == null) return "";Deque<TreeNode> deq = new ArrayDeque<>();// 可以提供后缀的末尾StringJoiner sj = new StringJoiner(",");deq.offer(root);sj.add(Integer.toString(root.val));while (!deq.isEmpty()){int size = deq.size();while (size-- >0){TreeNode node = deq.poll();if (node.left != null){deq.add(node.left);sj.add(Integer.toString(node.left.val));}else sj.add("null");if (node.right != null){deq.add(node.right);sj.add(Integer.toString(node.right.val));}else sj.add("null");}}return sj.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {if (data == "") return null;String[] strings = data.split(",");Deque<TreeNode> deq = new ArrayDeque<>();TreeNode root = new TreeNode(Integer.parseInt(strings[0]));deq.add(root);int index = 1; //定位当前位置,遍历顺序为中左右int l = strings.length;while(index < l){TreeNode node = deq.poll();if (!strings[index].equals("null")){TreeNode left = new TreeNode(Integer.parseInt(strings[index]));node.left = left;deq.add(left);}index++; //找右节点if (index < l && !strings[index].equals("null")){TreeNode right= new TreeNode(Integer.parseInt(strings[index]));node.right = right;deq.add(right);}index++; //找左节点}return root;}
}

BFS解法

public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuilder stringBuilder = new StringBuilder();return appendstr(root,stringBuilder).toString();}private StringBuilder appendstr(TreeNode node,StringBuilder stringBuilder){if (node == null) return stringBuilder.append("null,");else {// 中左右stringBuilder.append(Integer.toString(node.val)+",");stringBuilder = appendstr(node.left,stringBuilder);stringBuilder = appendstr(node.right,stringBuilder);}return stringBuilder;}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {String[] strings = data.split(",");// 速度更快List<String> nodes = new LinkedList<>(Arrays.asList(strings));return totree(nodes);}public TreeNode totree(List<String> nodes){if (nodes.get(0).equals("null")){nodes.remove(0);return  null;}TreeNode root = new TreeNode(Integer.parseInt(nodes.get(0)));nodes.remove(0);root.left = totree(nodes);root.right = totree(nodes);return root;}
}

相关文章:

leetcode刷题 | 关于二叉树的题型总结1

leetcode刷题 | 关于二叉树的题型总结1 文章目录leetcode刷题 | 关于二叉树的题型总结1题目连接完全二叉树插入器在每个树行中找最大值找树左下角的值二叉树的右视图二叉树剪枝题目连接 919. 完全二叉树插入器 - 力扣&#xff08;LeetCode&#xff09; 515. 在每个树行中找最…...

webpack新手入门

前言&#xff1a; 如何配置webpack呢&#xff1f; webpack概念有哪些呢&#xff1f; 怎么快速理解并使用webpack呢&#xff1f; 文章目录一. 什么是webpack二. 安装webpack三. webpack的五个核心概念四. webpack配置五. loader加载器1. css处理2. 处理文件&#xff08;图片&…...

Redis中有常见数据类型

Redis的数据类型 string数据类型 string是redis最基本的类型&#xff0c;而且string类型是二进制安全的。意思是redis的string可以包含任何 数据&#xff0c;比如jpg图片或者序列化的对象 String类型是最基本的数据类型&#xff0c;一个redis中字符串value最多可以是512M r…...

【知识梳理】Go语言核心编程

基础知识 Go语言就是为了解决编程语言对并发支持不友好、编译速度慢、编程复杂这三个问题而诞生的 特点: Go语言选择组合思想,抛弃继承关系通过接口组合,自由组合成新接口,用接口实现层与层之间的解耦语言特性对比: package mainimport "fmt"func main() {fmt…...

Java中动态调用setter以及getter

0x00 前言 对于非专业程序员的安全人员来说&#xff0c;因为没有代码项目的积累&#xff0c;很多知识体系都不完善&#xff0c;所以有必要在一些常用的内容进行学习的总结。 在很多的调用链中都会用到**“动态调用setter以及getter”**这个知识点&#xff0c;比如经典的CB链&a…...

基于 NeRF 的 App 上架苹果商店!照片转 3D 只需一部手机,网友们玩疯了

前言 只用一部手机&#xff0c;现实中的 2D 照片就能渲染出 3D 模型&#xff1f; 没错&#xff0c;无需再手动上传电脑或安装激光雷达&#xff0c;苹果手机自带 App 就能生成 3D 模型。 这个名叫 Luma AI 的“NeRF APP”&#xff0c;正式上架 App Store 后爆火&#xff1a; 小…...

C++类与对象(中)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C类中一共有六个默认成员函…...

计算机软件技术基础复习

数据结构 文章目录数据结构第一节 数据结构的基本概念第二节 线性结构线性表顺序表和链表的特点实现循环队列第三节 非线性结构树操作系统操作系统概述进程和程序存储空间的组织数据库技术数据库设计软件技术软件生命周期第一节 数据结构的基本概念 数据结构&#xff1a;指相互…...

python爬虫--beautifulsoup模块简介

BeautifulSoup 的引入 我们学习了正则表达式的相关用法&#xff0c;但是一旦正则写的有问题&#xff0c;可能得到的就不是我们想要的结果了&#xff0c;而且对于一个网页来说&#xff0c;都有一定的特殊的结构和层级关系&#xff0c;而且很多标签都有 id 或 class 来对作区分&…...

Swfit Copy On Write 原理解析

1. Swift Copy On write 原理是什么 Swift 中的 Copy On Write (COW) 技术是一种内存优化技术&#xff0c;其原理是在需要修改数据时才进行拷贝&#xff0c;以避免不必要的内存消耗。 COW 的实现主要依赖于 Swift 中的结构体和类的特性。对于结构体而言&#xff0c;它是值类型…...

【面试题】经典面试题:让 a == 1 a == 2 a == 3 成立?

一、问题解析 if (a == 1 && a == 2 && a == 3) {console.log(Win) } 复制代码 如何打印除Win? 看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢? 冷静下来,发现一些端倪。...

我是歌手-C语言

“我是歌手”是成名歌手之间的比赛节目&#xff0c;2轮比赛中观众支持率最低者出局。 这里我们假设有n个歌手进行了m轮比赛&#xff0c;请求出局者&#xff08;m轮总分最低者&#xff09;。 输入n个歌手&#xff08;编号依次为1&#xff0c;2&#xff0c;......n&#xff09;…...

Acwing---112.雷达设备

雷达设备1.题目2.基本思想3.代码实现1.题目 假设海岸是一条无限长的直线&#xff0c;陆地位于海岸的一侧&#xff0c;海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上&#xff0c;且雷达的监测范围为 d&#xff0c;当小岛与某雷达的距离不超…...

SSJ-21A AC220V静态【时间继电器】

系列型号&#xff1a; SSJ-11B静态时间继电器&#xff1b;SSJ-21B静态时间继电器 SSJ-21A静态时间继电器&#xff1b;SSJ-22A静态时间继电器 SSJ-22B静态时间继电器SSJ-42B静态时间继电器 SSJ-42A静态时间继电器SSJ-41A静态时间继电器 SSJ-41B静态时间继电器SSJ-32B静态时间继电…...

m序列发生器——Verilog设计

引言 本篇文章利用Verilog编写一个m序列发生器模块。本文会给出具体的设计、测试源码。 设计说明 模块功能说明: 支持任意位宽的随机数生成;支持本原多项式配置;支持初始种子配置;设计环境: 设计语言:Verilog HDL 设计验证平台:MATLAB R20222a、Vivado 2018.3 m 序列…...

Mysql—触发器

触发器 简介 触发器用于直接在某种操作后&#xff08;数据的增删改查等&#xff09;&#xff0c;通过事件执行设置触发器时的 sql 语句&#xff0c;具有原子性。 可通过 sql 语句直接编写&#xff0c;关键词&#xff1a;CREATE TRIGGER 触发器名称。 例如&#xff1a;在表 st…...

DVWA靶场通关和源码分析

文章目录一、Brute Force1.low2、medium3、High4、Impossible二、Command Injection1、Low2、Medium3、High三、CSRF1、Low2、Medium3、High4、Impossible四、File Inclusion1、Low2、Medium3、High五、File Upload1、Low2、Medium3、High4、Impossible六、 SQL注入1、Low2、Me…...

RocketMQ5.0.0消息存储<二>_消息存储流程

目录 一、消息存储概览 二、Broker接收消息 三、消息存储流程 1. DefaultMessageStore类 2. 存储流程 1)&#xff1a;同步与异步存储 2)&#xff1a;CommitLog异步存储消息 3)&#xff1a;提交消息&#xff08;Commit&#xff09; 四、参考资料 一、消息存储概览 如下图所…...

【单片机方案】蓝牙体温计方案介绍

蓝牙体温计方案的工作原理利用了温度传感器输出电信号&#xff0c;直接输出数字信号或者再将电流信号(模拟信号)转换成能够被内部集成的电路识别的数字信号&#xff0c;然后通过显示器(如液晶、数码管、LED矩阵等)显示以数字形式的温度&#xff0c;能记录、读取被测温度的最高值…...

React 的受控组件和非受控组件有什么不同

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天我们来看看 React 的受控组件和非受控组件有什么不同。 受控组件 受控组件&#xff0c;指的是将表单元素的值交给组件的 state 来保存。 例子&#xff1a; import ./styles.css import { useState } from reactconst App …...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...