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

瑞_力扣LeetCode_二叉树相关题

文章目录

    • 说明
    • 题目 144. 二叉树的前序遍历
      • 题解
    • 题目 94. 二叉树的中序遍历
      • 题解
    • 题目 145. 二叉树的后序遍历
      • 题解
    • 题目 105. 从前序与中序遍历序列构造二叉树
      • 题解
    • 题目 106. 从中序与后序遍历序列构造二叉树
      • 题解

🙊 前言:本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列,主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

在这里插入图片描述

说明

  本文主要是配合《瑞_数据结构与算法_二叉树》对二叉树的知识进行提升和拓展

题目 144. 二叉树的前序遍历

  原题链接:Leetcode144. 二叉树的前序遍历

  给你二叉树的根节点 root ,返回它节点值的前序遍历。

  示例 1:

在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,2,3]

  示例 2:

输入:root = []
输出:[]

  示例 3:

输入:root = [1]
输出:[1]

  示例 4:

在这里插入图片描述

输入:root = [1,2]
输出:[1,2]

  示例 5:

在这里插入图片描述

输入:root = [1,null,2]
输出:[1,2]

  提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

  进阶:递归算法很简单,你可以通过迭代算法完成吗?

题解

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> preorderTraversal(TreeNode root) {/** 栈*/LinkedList<TreeNode> stack = new LinkedList<>();/** 代表当前节点*/TreeNode current = root;/** 最近一次弹栈的元素*/TreeNode pop = null;List<Integer> result = new ArrayList<>();while (!stack.isEmpty() || current != null) {if (current != null) {stack.push(current);// 待处理左子树result.add(current.val);current = current.left;} else {TreeNode peek = stack.peek();// 没有右子树if (peek.right == null) {// 获取最近一次弹栈的元素pop = stack.pop();}// 右子树处理完成else if (peek.right == pop) {// 获取最近一次弹栈的元素pop = stack.pop();}// 待处理右子树else {current = peek.right;}}}return result;}
}

题目 94. 二叉树的中序遍历

  原题链接:Leetcode94. 二叉树的中序遍历

  给定一个二叉树的根节点 root ,返回 它的中序遍历 。

  示例 1:

在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,3,2]

  示例 2:

输入:root = []
输出:[]

  示例 3:

输入:root = [1]
输出:[1]

  提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

  进阶: 递归算法很简单,你可以通过迭代算法完成吗?

题解

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {/** 栈*/LinkedList<TreeNode> stack = new LinkedList<>();/** 代表当前节点*/TreeNode current = root;/** 最近一次弹栈的元素*/TreeNode pop = null;List<Integer> result = new ArrayList<>();while (!stack.isEmpty() || current != null) {if (current != null) {stack.push(current);// 待处理左子树current = current.left;} else {TreeNode peek = stack.peek();// 没有右子树if (peek.right == null) {result.add(peek.val);// 获取最近一次弹栈的元素pop = stack.pop();}// 右子树处理完成else if (peek.right == pop) {// 获取最近一次弹栈的元素pop = stack.pop();}// 待处理右子树else {result.add(peek.val);current = peek.right;}}}return result;}
}

题目 145. 二叉树的后序遍历

  原题链接:Leetcode145. 二叉树的后序遍历

  示例 1:
在这里插入图片描述

输入:root = [1,null,2,3]
输出:[3,2,1]

  示例 2:

输入:root = []
输出:[]

  示例 3:

输入:root = [1]
输出:[1]

  说明:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

  进阶:递归算法很简单,你可以通过迭代算法完成吗?

题解

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> postorderTraversal(TreeNode root) {/** 栈*/LinkedList<TreeNode> stack = new LinkedList<>();/** 代表当前节点*/TreeNode current = root;/** 最近一次弹栈的元素*/TreeNode pop = null;List<Integer> result = new ArrayList<>();while (!stack.isEmpty() || current != null) {if (current != null) {stack.push(current);// 待处理左子树current = current.left;} else {TreeNode peek = stack.peek();// 没有右子树if (peek.right == null) {// 获取最近一次弹栈的元素pop = stack.pop();result.add(pop.val);}// 右子树处理完成else if (peek.right == pop) {// 获取最近一次弹栈的元素pop = stack.pop();result.add(pop.val);}// 待处理右子树else {current = peek.right;}}}return result;}
}

题目 105. 从前序与中序遍历序列构造二叉树

  原题链接:Leetcode105. 从前序与中序遍历序列构造二叉树

  给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

  示例 1:

在这里插入图片描述

	输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输出: [3,9,20,null,null,15,7]

  示例 2:

	输入: preorder = [-1], inorder = [-1]输出: [-1]

  提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorderinorder无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

题解

  思路

	1. 前序遍历(preorder)的第一个值肯定是根节点。通过preorder寻找根节点。2. 中序遍历(inorder)在根节点之前的值是根节点的左子树部分,而之后的值是根节点的右子树部分。通过inorder区分左右子树部分。3. 通过循环inorder使用根节点确定中序遍历的左右子树部分、前序遍历的左右子树部分。4. 根据1.2.3.继续分为子问题,递归解决。
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode buildTree(int[] preOrder, int[] inOrder) {if (preOrder.length == 0) {return null;}// 创建根节点int rootValue = preOrder[0];TreeNode root = new TreeNode(rootValue);// 区分左右子树for (int i = 0; i < inOrder.length; i++) {if (inOrder[i] == rootValue) {// 0 ~ i-1 左子树// i+1 ~ inOrder.length -1 右子树int[] inLeft = Arrays.copyOfRange(inOrder, 0, i); int[] inRight = Arrays.copyOfRange(inOrder, i + 1, inOrder.length); int[] preLeft = Arrays.copyOfRange(preOrder, 1, i + 1);int[] preRight = Arrays.copyOfRange(preOrder, i + 1, preOrder.length); root.left = buildTree(preLeft, inLeft); root.right = buildTree(preRight, inRight); break;}}return root;}
}

瑞:可以使用HashMap优化,以及新数组可以通过索引坐标参数传递优化。具体可见本系列HashMap章节(后续更新)

题目 106. 从中序与后序遍历序列构造二叉树

  原题链接:Leetcode106. 从中序与后序遍历序列构造二叉树

  给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

  示例1:

在这里插入图片描述

	输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输出:[3,9,20,null,null,15,7]

  示例2:

	输入:inorder = [-1], postorder = [-1]输出:[-1]

  提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorderpostorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

题解

  思路

	1. 后序遍历(postorder)的最后一个元素就是根节点。通过postorder寻找根节点。2. 中序遍历(inorder)在根节点之前的值是根节点的左子树部分,而之后的值是根节点的右子树部分。通过inorder区分左右子树部分。3. 通过循环inorder使用根节点确定中序遍历的左右子树部分、后序遍历的左右子树部分。4. 根据1.2.3.继续分为子问题,递归解决。
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode buildTree(int[] inOrder, int[] postOrder) {if (inOrder.length == 0) {return null;}// 根int rootValue = postOrder[postOrder.length - 1];TreeNode root = new TreeNode(rootValue);// 切分左右子树for (int i = 0; i < inOrder.length; i++) {if (inOrder[i] == rootValue) {int[] inLeft = Arrays.copyOfRange(inOrder, 0, i);int[] inRight = Arrays.copyOfRange(inOrder, i + 1, inOrder.length);int[] postLeft = Arrays.copyOfRange(postOrder, 0, i);int[] postRight = Arrays.copyOfRange(postOrder, i, postOrder.length - 1);root.left = buildTree(inLeft, postLeft);root.right = buildTree(inRight, postRight);break;}}return root;}
}



本文是博主的粗浅理解,可能存在一些错误或不完善之处,如有遗漏或错误欢迎各位补充,谢谢

  如果觉得这篇文章对您有所帮助的话,请动动小手点波关注💗,你的点赞👍收藏⭐️转发🔗评论📝都是对博主最好的支持~


相关文章:

瑞_力扣LeetCode_二叉树相关题

文章目录 说明题目 144. 二叉树的前序遍历题解 题目 94. 二叉树的中序遍历题解 题目 145. 二叉树的后序遍历题解 题目 105. 从前序与中序遍历序列构造二叉树题解 题目 106. 从中序与后序遍历序列构造二叉树题解 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《刷题》的…...

Axios设置token到请求头的三种方式

1、为什么要携带token? 用户登录时&#xff0c;后端会返回一个token&#xff0c;并且保存到浏览器的localstorage中&#xff0c;可以根据localstorage中的token判断用户是否登录&#xff0c;登录后才有权限访问相关的页面&#xff0c;所以当发送请求时&#xff0c;都要携带to…...

微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用

1 微服务的概念 区别于单体项目 单体项目拆分成微服务项目的目标&#xff1a;高内聚、低耦合 拆分思路 纵向拆分&#xff1a;根据功能模块 横向拆分&#xff1a;抽取可复用模块 2 微服务拆分——远程调用 背景&#xff1a;微服务单一职责&#xff0c;每个服务只有自己的功能…...

Arthas使用教程—— 阿里开源线上监控诊断产品

文章目录 1 简介2背景3 图形界面工具 arthas 阿里开源3.1 &#xff1a;启动 arthas3.2 help :查看arthas所有命令3.3 查看 dashboard3.4 thread 列出当前进程所有线程占用CPU和内存情况3.5 jvm 查看该进程的各项参数 &#xff08;类比 jinfo&#xff09;3.6 通过 jad 来反编译 …...

mac电脑快捷指令实现拼图

mac访达&#xff0c;搜索输入‘快捷指令’&#xff0c;找到‘快捷指令’&#xff0c; 点击快捷指令&#xff0c;进入快捷指令中心&#xff0c;搜索‘拼图’ &#xff0c;选中‘照片拼图’&#xff0c; 点击‘添加快捷指令’&#xff0c; 在‘所有快捷键指令’中可以看到添加的快…...

R语言入门笔记2.1

分支、循环与函数&#xff08;1&#xff09; 1.if语句 在R语言中&#xff0c;if语句用于根据条件执行不同的代码块。其基本语法如下&#xff1a; if (condition) {# 如果条件为真&#xff0c;执行这里的代码块 } else {# 如果条件为假&#xff0c;执行这里的代码块 } 其中&…...

补题:leetcode第382场周赛 3022. 给定操作次数内使剩余元素的或值最小

3022. 给定操作次数内使剩余元素的或值最小 - 力扣&#xff08;LeetCode&#xff09; 拆位 n个数进行或运算的结果最小&#xff0c;每次操作可以对相邻的两个数进行与运算&#xff0c;至多进行k次操作 n个数进行或运算&#xff0c;可以对每个数进行拆解&#xff0c;拆解成最小…...

创建型模式-单例模式:定义、实现及应用

目录 一、模式定义二、针对问题1.解决的问题2.解决方案3.举个例子4.设计模式适合场景5.实现方式6.优缺点7.与其他模式的关系 三、代码实现 一、模式定义 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型模式&#xff0c;用于限制某个类只能创建一个对象。它提…...

Prime(VulnHub)

Prime 文章目录 Prime1、nmap2、web渗透随便看看首页隐写查看目录爆破gobusterferoxbusterdirsearchdirb whatwebsearchsploit WordPress 5.2.2/dev/secret.txtFuzz_For_Webwfuzzimage.phpindex.php location.txtsecrettier360文件包含漏洞包含出password.txt尝试ssh登入尝试登…...

爬虫工作量由小到大的思维转变---<第四十二章 Scrapy Redis 重试机制(ip相关)>

前言: 之前讲过一篇关于scrapy的重试机制的文章,那个是针对当时那哥们的代码讲的,但是,发现后面还是有很多问题; 本章节就着scrapy的重试机制来讲一下!!! 正文: 首先,要清楚一个概念,在scrapy的中间件中,默认会有一个scrapy重试中间件;只要你在settings.py设置中写上: RETR…...

python日志管理配置

日志基础配置文件 日志回转查看&#xff1a;参考&#xff1a;https://blog.csdn.net/B11050729/article/details/132353220 项目使用注解实现 """ settings.py logging配置 """ import osroot_dir os.path.normpath(os.path.join(os.path.ab…...

2024.1.28力扣每日一题——水壶问题

2024.1.28 题目来源我的题解方法一 深度搜索&#xff08;DFS&#xff09;/广度搜索&#xff08;BFS&#xff09;方法二 数学 题目来源 力扣每日一题&#xff1b;题序&#xff1a;365 我的题解 方法一 深度搜索&#xff08;DFS&#xff09;/广度搜索&#xff08;BFS&#xff…...

orin nx 安装paddlespeech记录

nx配置&#xff1a; 模块 版本说明 CPU 8核 内存 16G Cuda版本 11.4 Opencv版本 4.5.4 Tensorrt版本 5.1 Cudnn版本 8.6.0.166 Deepstream版本 6.2 Python版本 3.8 算力 100T 安装paddlepaddle&#xff1a; 去飞桨官网下载jetpack版本的&#xff1a;下…...

系统架构设计师-21年-上午答案

系统架构设计师-21年-上午答案 更多软考资料 https://ruankao.blog.csdn.net/ 1 ~ 10 1 前趋图(Precedence Graph)是一个有向无环图&#xff0c;记为:→{(Pi,Pj)|Pi must complete before Pj may strat}&#xff0c;假设系统中进程P{P1&#xff0c;P2&#xff0c;P3&#xf…...

外包干了10个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

树莓派Pico入门

文章目录 1. Pico概述1.1 微处理器1.2 GPIO引脚1.3 MicroPython优点 2. 硬件准备2.1 购买清单2.2 软件需求 3. 安装MicroPython3.1下载固件3.2把固件安装到硬件里3.3补充 4. 第一个程序5. 验证运行效果6. 扩展应用 1. Pico概述 1.1 微处理器 ARM Cortex-M0 (频率 133MHz) 1.…...

yolov8使用旋转框自己做数据集检测

主要在数据集制作&#xff0c;训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具&#xff0c;这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件&#xff0c;然后把dota的xml文件转换成dota的txt文件…...

docker重建镜像

DockerFile如下&#xff1a; FROM k8s-registry.qhtx.local/base/centos7-jdk8-haitong0704RUN yum -y update && yum install -y python3-devel && yum install -y python36 RUN mv /usr/bin/python /usr/bin/python_old RUN ln -s /usr/bin/python3 /usr/bi…...

【Linux】vim的基本操作与配置(上)

Hello everybody!今天我们要进入vim的讲解了。学会了vim,咱们就可以在Linux系统上做一些简单的编程啦&#xff01; 那么废话不多说&#xff0c;咱们直接进入正题&#xff01; 1.初识vim vim是一款多模式的文本编辑器&#xff0c;可以对一个文件进行编辑操作。 它一共有三个模…...

幻兽帕鲁怎么样?好玩? Mac版的玩《幻兽帕鲁》也很简单,只需三个步骤

幻兽帕鲁怎么样 幻兽帕鲁是一款集合了多种游戏元素的游戏&#xff0c;它巧妙地融合了《方舟:生存进化》的野外生存挑战、《荒野之息》的开放世界探索、《魔兽世界》的多元角色互动以及宝可梦的精灵捕捉与培养等经典游戏元素。游戏的核心系统是「帕鲁」捕获&#xff0c;你可以让…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...