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

刷算法Leetcode---7(二叉树篇)(前中后序遍历)

前言

        本文是跟着代码随想录的栈与队列顺序进行刷题并编写的 代码随想录

        好久没刷算法了,最近又开始继续刷,果然还是要坚持。

        二叉树的题目比之前多了好多,就多分几次写啦~

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

二叉树篇(前中后序遍历)

(1)144.二叉树的前序遍历

        ①递归,先加入当前节点值,再递归左右子节点

        ②栈迭代,先获取当前节点值,注意右节点先入栈,左节点后入栈

        ③栈迭代,从根开始遍历左节点,取值并入栈,再取栈顶右节点重复

        ④Morris遍历,将左节点的最右节点(即p2)右指针指向根,不使用额外空间,实现左子树遍历完后就回到根遍历右子树。若p2右指针为空,代表该树(即p1)的左子树未遍历

        核心思想:添加根p1的值(即为中),遍历左节点,左不空就添加指向根的指针并继续往左,左空就添加该节点值(即为左)并找右节点,若右节点不为根就作为新子树遍历(即为右),若为根就回到之前的树遍历右节点并添加

class Solution {private List<Integer> res;public List<Integer> preorderTraversal(TreeNode root) {res = new ArrayList<>();TreeNode p1 = root, p2 = new TreeNode();while(p1!=null){if(p1.left==null){res.add(p1.val);p1=p1.right;}else{p2=p1.left;while(p2.right!=null&&p2.right!=p1){p2=p2.right;}if(p2.right==null){p2.right=p1;res.add(p1.val);p1=p1.left;}else{p2.right=null;p1=p1.right;}}}return res;}
}

(2)145.二叉树的后序遍历

        ①递归,先递归左右子节点,再加入当前节点值

        ②栈迭代,取栈头,左右节点依次入栈,栈头值头插到结果

        ③Morris遍历,核心思路还是创建一个右子树最后一个节点到根的指针,由于根节点最后添加,要实现一个左节点到最右节点添加的方法

        核心思想:从根p1开始,左不空就添加指向根的指针并继续往左,左空就添加(即为左)并遍历右节点,右不为根就作为新树遍历左节点,右为p1就代表所有左节点遍历完,将p1左节点到p2的节点逆序添加(即为右+中),注意最后要将根到整棵树最右节点的路径逆序添加

class Solution {private List<Integer> res;public List<Integer> postorderTraversal(TreeNode root) {res = new ArrayList<>();TreeNode p1=root,p2=null;while(p1!=null){if(p1.left==null){p1=p1.right;}else{p2=p1.left;while(p2.right!=null&p2.right!=p1){p2=p2.right;}if(p2.right==null){p2.right=p1;p1=p1.left;}else{p2.right=null;addRightPath(p1.left);p1=p1.right;}}}addRightPath(root);return res;}private void addRightPath(TreeNode node){int p = res.size();while(node!=null){res.add(p,node.val);node=node.right;}}
}

(3)94.二叉树的中序遍历

        ①递归,先递归左子树,再加入当前节点值,再递归右子树

        ②栈迭代,一直找到最左节点并依次入栈,此时栈顶值加入结果,并将右节点作为当前节点,当栈或当前节点都不空时进行循环(注意是或)

        注意:由于中序遍历要将根节点记录的中间,没办法像前序或后序实现简洁的迭代,必须先将左子树遍历完

        ③Morris遍历,与之前遍历思路同,创建一个右子树最后一个节点到根的指针。先将左子树遍历完(即左)后再添加根节点(即中),再遍历右子树(即右)。

class Solution {private List<Integer> res;public List<Integer> inorderTraversal(TreeNode root) {res = new ArrayList<>();TreeNode p1=root,p2=null;while(p1!=null){if(p1.left==null){res.add(p1.val);p1=p1.right;}else{p2=p1.left;while(p2.right!=null&&p2.right!=p1){p2=p2.right;}if(p2.right==null){p2.right=p1;p1=p1.left;}else{p2.right=null;res.add(p1.val);p1=p1.right;}}}return res;}
}

二叉树篇(前中后序遍历)总结

        ①区分三种遍历顺序,前序(根左右)中序(左根右)后序(左右根),指的是根的位置

        ②都有递归实现的方法,代码简洁易懂,只用注意根添加和左右子树递归的顺序即可

        ③都有迭代实现的方式,需要显式栈辅助。都可以先将左子树全遍历完再遍历右子树,需要两层while。其中前序和后序有较简洁的迭代,每次将左右节点按特定顺序入栈即可,而中序遍历一定要先遍历完左子树才行

        ④都有Morris遍历,特点在于将左节点的最右节点右指针指向根节点,从而实现左子树遍历完后回到根节点遍历右子树,节点添加顺序有不同。特别是后序遍历对最右路径节点的单独添加,最好自己调试一遍更容易理解

        ⑤一般来说能用递归实现,就能用栈实现,因为递归是隐式栈

        ⑥代码随想录中有一种二叉树的统一迭代法,对前中后序的迭代遍历使用几乎相同的算法,只修改栈的添加顺序,感兴趣可以看一下,我记不下来就没看

相关文章:

刷算法Leetcode---7(二叉树篇)(前中后序遍历)

前言 本文是跟着代码随想录的栈与队列顺序进行刷题并编写的 代码随想录 好久没刷算法了&#xff0c;最近又开始继续刷&#xff0c;果然还是要坚持。 二叉树的题目比之前多了好多&#xff0c;就多分几次写啦~ 这是力扣刷算法的其他文章链接&#xff1a;刷算法Leetcode文章汇总 …...

AliyunOS安装Node.js

方法1&#xff1a;dnf软件包安装工具自动安装 最方便的安装方式是通过系统的dnf工具&#xff0c;我测试使用的AliyunOS的版本是Alibaba Cloud Linux 3.2104&#xff0c;具体流程如下&#xff1a; dnf module list nodejs #列出服务器中可以使用的所有nodejs版本确定下来希望安…...

three.js - MeshPhongMaterial材质(实现玻璃水晶球效果)

1、概念 phong网格材质&#xff1a;Mesh - Phong - Material 一种用于具有镜面高光的光泽表面的材质。 它可以模拟&#xff0c;具有镜面高光的光泽表面&#xff0c;提供镜面反射效果。 MeshPhongMaterial&#xff1a; MeshPhongMaterial是一种基于Phong光照模型的材质&#…...

笔记本电脑安装CentOS

正文共&#xff1a;1234 字 24 图&#xff0c;预估阅读时间&#xff1a;2 分钟 前面我们对VPP进行了多次介绍&#xff08;羡慕&#xff01;大佬的VPP能达到180G性能&#xff0c;而我的却只有13.5G&#xff09;&#xff0c;可以发现他的很多优点&#xff0c;但是我们也可以发现它…...

ssh转发功能入门

端口转发概述 端口转发&#xff0c;能够将其他TCP端口的网络数据通过SSH链路转发&#xff0c;并且提供了ssh的加密和解密的服务。 ssh端口转发有如下这些优点&#xff1a; 提供了ssh的加密传输&#xff0c;利于安全能够突破防火墙限制 目前ssh端口转发有如下几种方式&#x…...

Listary(Windows 文件搜索工具)专业版值得购买吗?

说到经典的国货软件&#xff0c;有一款 Win 软件是一定绕不过去的。它就是知名的本地文件搜索工具 Listary&#xff01; 便捷的文件搜索窗口&#xff1b;快捷操作的体验&#xff1b;与系统更匹配的外观设计&#xff1b;更智能的排序和更可靠的索引。 便捷的文件搜索窗口 紧凑…...

面试突击指南:Java基础面试题2

面向对象和集合 1. 面向对象和面向过程的区别 面向过程:面向过程的编程方式是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,并在使用的时候逐个调用。这种方式性能较高,因此在单片机和嵌入式开发中经常采用面向过程开发。 面向对象:面向对象的编程方式是把问…...

MySQL快速安装(mysql8.0.30区别之前yum安装)

目录 一.初始化环境并解压 二.创建程序用户管理 三.修改mysql目录和配置文件的权限 四.修改配置文件 五.设置环境变量&#xff0c;申明/宣告mysql命令便于系统识别 六.初始化数据库 七.设置系统识别&#xff0c;进行操作 八.初始化数据库密码 九.用户并设置密码 十.赋…...

俄罗斯防空系统

俄罗斯的S系列防空系统是一系列先进的地对空导弹系统&#xff0c;旨在防御各类空中威胁&#xff0c;包括飞机、无人机、巡航导弹和弹道导弹。以下是几种主要的S系列防空系统&#xff1a; 1. **S-300系统**&#xff1a; - **S-300P**&#xff1a;最早期的版本&#xff0c;用…...

文件上传漏洞---Pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本文重点从靶场案例分析文件上传漏洞常见的Pylod&#xff0c;本文演示靶场upload-labs 一.文件类型---Pyload 不同的文件对应不同的文件类型&#xff0c;后端代码通过限制特定的文件类型…...

应用案例 | 如何监测高价值货物在物流运输过程中受到的振动和冲击?全面保障货物安全

一、货物运输 不同种类的货物对运输的要求不同&#xff0c;钢铁、煤炭、矿石等大宗物资通常对运输要求较低&#xff0c;而电子产品、IT 产品、家电等高价值敏感类货物则更强调运输的安全性和时效性&#xff0c;往往希望能尽可能安全和快速送达这类货物&#xff0c;使之尽快进入…...

VMware17安装Ubuntu20版本-保姆级别

首先需要安装好VMware和Ubuntu20的镜像&#xff0c;在网上搜索Ubuntu镜像下载即可&#xff0c;最后选择国内镜像站下载&#xff0c;这样更快点&#xff0c;然后打开VMware。 1.创建虚拟机&#xff1a; 2.选择自定义&#xff1a; 3.默认&#xff0c;继续下一步&#xff1a; 4.选…...

初探Xcode工具

初探Xcode工具 Xcode是苹果公司为Mac OS X和iOS平台开发软件的集成开发环境&#xff08;IDE&#xff09;。作为苹果开发者的首选工具&#xff0c;Xcode提供了一系列强大的功能&#xff0c;帮助开发者设计、编写、调试和发布应用程序。本文将对Xcode进行初步探索&#xff0c;介…...

小迪安全v2023笔记 1-18

小迪安全v2023笔记 1-18 棱角社区 文章目录 1. 基础入门1. 正向shell与反向shell2. web应用3. 抓包&#xff0c;封包&#xff0c;协议&#xff0c;app&#xff0c;小程序&#xff0c;pc应用&#xff0c;web应用 2. 信息打点1. 常见信息获取2. 文件泄露3. 常见阻碍4. CDN绕过&a…...

RabbitMQ WEB管理端介绍

页面功能概览 Overview(概述)Connections(连接)Channels(通道)Exchanges(交换器)Queues(队列)Admin(用户管理)。 1. Overview(概述) 主要分为三部分 1.1 Queued messages&#xff08;所有队列的消息情况&#xff09; Ready&#xff1a;待消费的消息总数Unacked&#xff1a;待应…...

三阶魔方公式详解及快速解法方法介绍

三阶魔方公式详解及快速解法方法介绍 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来深入探讨三阶魔方的公式及其快速解法方法。无论是初学者还是已经…...

前端的拖拽和缩放(缩放以鼠标为中心)

效果&#xff1a; 拖拽和缩放&#xff08;缩放以鼠标为中心&#xff09; 代码具体实现如下&#xff1a; 但是有几个注意点 &#xff08;1&#xff09;为什么需要设置 transform-origin: 0 0; 缩放时以鼠标为中心进行缩放。这意味着需要手动计算缩放过程中元素的位移&#…...

【Vue】单向和双向数据绑定

在 Vue.js 中&#xff0c;数据绑定可以分为单向数据绑定和双向数据绑定两种类型。 单向数据绑定 单向数据绑定是指数据从模型流向视图&#xff0c;即数据的变化会自动反映到视图中&#xff0c;但视图中的变化不会自动反映回模型。Vue.js 中的单向数据绑定主要通过以下方式实现…...

HDFS学习

3.5 HDFS存储原理 3.5.1 冗余数据保存 作为一个分布式文件系统&#xff0c;为了保证系统的容错性和可用性&#xff0c;HDFS采用了多副本方式对数据进行冗余存储&#xff0c;通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示&#xff0c;数据块1被分别存放到…...

Winform使用HttpClient调用WebApi的基本用法

Winform程序调用WebApi的方式有很多&#xff0c;本文学习并记录采用HttpClient调用基于GET、POST请求的WebApi的基本方式。WebApi使用之前编写的检索环境检测数据的接口&#xff0c;如下图所示。 调用基于GET请求的无参数WebApi 创建HttpClient实例后调用GetStringAsync函数获…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...