当前位置: 首页 > 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 …...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...

2025年全国I卷数学压轴题解答

第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos ⁡ x − cos ⁡ ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min ⁡ t max ⁡ x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…...

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug&#xff1f; Pug&#xff08;原名 Jade&#xff09;是一种高效的网页模板引擎&#xff0c;通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签&#xff0c;使用缩进定义结构&#xff0c;…...

Redis:常用数据结构 单线程模型

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Redis &#x1f525; 常用数据结构 &#x1f433; Redis 当中常用的数据结构如下所示&#xff1a; Redis 在底层实现上述数据结构的过程中&#xff0c;会在源码的角度上对于上述的内容进行特定的…...