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. 完全二叉树插入器 - 力扣(LeetCode) 515. 在每个树行中找最…...
webpack新手入门
前言: 如何配置webpack呢? webpack概念有哪些呢? 怎么快速理解并使用webpack呢? 文章目录一. 什么是webpack二. 安装webpack三. webpack的五个核心概念四. webpack配置五. loader加载器1. css处理2. 处理文件(图片&…...
Redis中有常见数据类型
Redis的数据类型 string数据类型 string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何 数据,比如jpg图片或者序列化的对象 String类型是最基本的数据类型,一个redis中字符串value最多可以是512M r…...
【知识梳理】Go语言核心编程
基础知识 Go语言就是为了解决编程语言对并发支持不友好、编译速度慢、编程复杂这三个问题而诞生的 特点: Go语言选择组合思想,抛弃继承关系通过接口组合,自由组合成新接口,用接口实现层与层之间的解耦语言特性对比: package mainimport "fmt"func main() {fmt…...
Java中动态调用setter以及getter
0x00 前言 对于非专业程序员的安全人员来说,因为没有代码项目的积累,很多知识体系都不完善,所以有必要在一些常用的内容进行学习的总结。 在很多的调用链中都会用到**“动态调用setter以及getter”**这个知识点,比如经典的CB链&a…...
基于 NeRF 的 App 上架苹果商店!照片转 3D 只需一部手机,网友们玩疯了
前言 只用一部手机,现实中的 2D 照片就能渲染出 3D 模型? 没错,无需再手动上传电脑或安装激光雷达,苹果手机自带 App 就能生成 3D 模型。 这个名叫 Luma AI 的“NeRF APP”,正式上架 App Store 后爆火: 小…...
C++类与对象(中)
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:C 🔥<3>创作者:我的代码爱吃辣 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:C类中一共有六个默认成员函…...
计算机软件技术基础复习
数据结构 文章目录数据结构第一节 数据结构的基本概念第二节 线性结构线性表顺序表和链表的特点实现循环队列第三节 非线性结构树操作系统操作系统概述进程和程序存储空间的组织数据库技术数据库设计软件技术软件生命周期第一节 数据结构的基本概念 数据结构:指相互…...
python爬虫--beautifulsoup模块简介
BeautifulSoup 的引入 我们学习了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多标签都有 id 或 class 来对作区分&…...
Swfit Copy On Write 原理解析
1. Swift Copy On write 原理是什么 Swift 中的 Copy On Write (COW) 技术是一种内存优化技术,其原理是在需要修改数据时才进行拷贝,以避免不必要的内存消耗。 COW 的实现主要依赖于 Swift 中的结构体和类的特性。对于结构体而言,它是值类型…...
【面试题】经典面试题:让 a == 1 a == 2 a == 3 成立?
一、问题解析 if (a == 1 && a == 2 && a == 3) {console.log(Win) } 复制代码 如何打印除Win? 看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢? 冷静下来,发现一些端倪。...
我是歌手-C语言
“我是歌手”是成名歌手之间的比赛节目,2轮比赛中观众支持率最低者出局。 这里我们假设有n个歌手进行了m轮比赛,请求出局者(m轮总分最低者)。 输入n个歌手(编号依次为1,2,......n)…...
Acwing---112.雷达设备
雷达设备1.题目2.基本思想3.代码实现1.题目 假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上,且雷达的监测范围为 d,当小岛与某雷达的距离不超…...
SSJ-21A AC220V静态【时间继电器】
系列型号: SSJ-11B静态时间继电器;SSJ-21B静态时间继电器 SSJ-21A静态时间继电器;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—触发器
触发器 简介 触发器用于直接在某种操作后(数据的增删改查等),通过事件执行设置触发器时的 sql 语句,具有原子性。 可通过 sql 语句直接编写,关键词:CREATE TRIGGER 触发器名称。 例如:在表 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):同步与异步存储 2):CommitLog异步存储消息 3):提交消息(Commit) 四、参考资料 一、消息存储概览 如下图所…...
【单片机方案】蓝牙体温计方案介绍
蓝牙体温计方案的工作原理利用了温度传感器输出电信号,直接输出数字信号或者再将电流信号(模拟信号)转换成能够被内部集成的电路识别的数字信号,然后通过显示器(如液晶、数码管、LED矩阵等)显示以数字形式的温度,能记录、读取被测温度的最高值…...
React 的受控组件和非受控组件有什么不同
大家好,我是前端西瓜哥,今天我们来看看 React 的受控组件和非受控组件有什么不同。 受控组件 受控组件,指的是将表单元素的值交给组件的 state 来保存。 例子: import ./styles.css import { useState } from reactconst App …...
从继电器到边缘计算:拆解PAC控制器里的‘智能手机’架构(以Codesys/倍福为例)
从继电器到边缘计算:拆解PAC控制器里的‘智能手机’架构 在工业自动化领域,PAC(可编程自动化控制器)正逐渐取代传统PLC,成为智能制造的核心大脑。这种转变类似于功能手机向智能手机的进化——从单一功能到开放平台&…...
告别手动建造:TEdit免费地图编辑器如何10倍提升泰拉瑞亚创作效率
告别手动建造:TEdit免费地图编辑器如何10倍提升泰拉瑞亚创作效率 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also l…...
华为eNSP Cloud网卡异常排查指南:从WinPcap兼容性到虚拟网卡同步
1. 华为eNSP Cloud网卡异常排查指南 最近在帮朋友调试华为eNSP Cloud时遇到了网卡异常的问题,折腾了大半天才解决。这个问题其实挺常见的,特别是对于刚接触eNSP Cloud的新手来说。今天我就把完整的排查流程和解决方法分享给大家,希望能帮到遇…...
如何3分钟搞定抖音无水印批量下载:免费工具终极指南
如何3分钟搞定抖音无水印批量下载:免费工具终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
别再只会用IP核了!手把手教你用Verilog从零实现一个16阶FIR滤波器(附完整代码)
从零构建16阶FIR滤波器:Verilog实战指南与工程思维解析 在FPGA开发领域,FIR(有限脉冲响应)滤波器是数字信号处理的基础模块,但大多数工程师习惯直接调用厂商提供的IP核,这就像只会开自动挡汽车的司机——虽…...
开源物联网平台SiteWhere:架构解析与实战部署指南
1. 项目概述:一个开源的物联网应用平台如果你正在寻找一个能够快速搭建、灵活扩展,并且能统一管理成千上万台设备的物联网平台,那么你很可能已经听说过或者正在评估 SiteWhere。作为一个在物联网领域摸爬滚打了多年的从业者,我见过…...
国产替代之NVMFS5C673NWFT1G 与 VBQA1615 参数对比报告
N沟道功率MOSFET参数对比分析报告一、产品概述NVMFS5C673NWFT1G:安森美(onsemi)N沟道功率MOSFET,耐压60V,极低导通电阻(10.7mΩ),采用先进沟槽工艺,具有低栅极电荷和电容…...
2026年市面上的培训机构管理系统对比,谁才是性价比之王
教务是培训机构的 “心脏”,而排课是教务最核心、最耗时、最容易出错的环节。传统人工排课:打开 Excel,手动填教师、教室、学员、时间,反复核对冲突,排一周课表要 1–3 天,还经常出现:老师时间撞…...
ADI GitHub工程编译指南:以ADRV9009/ZC706为例,搞懂Tcl脚本工程的结构与自动化构建
ADI GitHub工程编译指南:深入解析Tcl脚本工程与自动化构建体系 当你在GitHub上打开Analog Devices的HDL仓库时,可能会被密密麻麻的Tcl脚本和Makefile文件搞得一头雾水。这种以脚本驱动的硬件项目组织方式,正逐渐成为开源硬件领域的标准实践。…...
高速PCB设计:信号完整性与电磁场思维实战解析
1. 高速PCB设计的核心挑战与设计思维转变十年前我刚接触高速PCB设计时,曾天真地认为只要把线连通就能工作。直到某次设计的DDR3内存模块在800MHz频率下频繁出错,才真正理解到:当信号上升时间进入亚纳秒级,PCB上的每毫米走线都成为…...
