刷算法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遍历,特点在于将左节点的最右节点右指针指向根节点,从而实现左子树遍历完后回到根节点遍历右子树,节点添加顺序有不同。特别是后序遍历对最右路径节点的单独添加,最好自己调试一遍更容易理解

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch读写模型(state_dict、torch.save、torch.load)

1. state_dict 在PyTorch中&#xff0c;state_dict 是一个简单的python的字典对象&#xff0c;将每一层与它的对应参数建立映射关系。(如model的每一层的weights及bias等) 首先&#xff0c;我们来定义一个MLP模型&#xff1a; import torch.nn as nnclass MLP(nn.Module):de…

494. 目标和 Medium

给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添加 - &#xff0c;然…

使用Calendar.add进行日期计算

使用Calendar.add进行日期计算 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Java中如何使用Calendar.add方法进行日期计算。Calendar类是…

如何在Ubuntu20上离线安装joern(包括sbt和scala)

在Ubuntu 20上离线安装Joern&#xff0c;由于Joern通常需要通过互联网从其官方源或GitHub等地方下载&#xff0c;但在离线环境中&#xff0c;我们需要通过一些额外的步骤来准备和安装。&#xff08;本人水平有限&#xff0c;希望得到大家的指正&#xff09; 我们首先要做的就是…

在QGIS中调用天地图

2019年 1月 1日起&#xff0c;天地图 API及服务接口调用需要获得开发授权&#xff0c;之前使用 QGIS等 GIS软件无法继续调用天地图&#xff0c;这就需要申请一个许可。 一、注册并申请 Key 具体申请可以登录如下地址&#xff1a;https://www.tianditu.gov.cn打开上述网址后点…

速盾:cdn加速哪个好?

在现代互联网时代&#xff0c;网站的速度和稳定性是非常重要的。为了提供最佳的用户体验&#xff0c;许多网站和应用程序都使用CDN&#xff08;内容分发网络&#xff09;来加速其内容的传输。CDN是由位于全球各地的分布式服务器组成的网络&#xff0c;其目的是将内容尽可能快地…

工厂方法模式:概念与应用

目录 工厂方法模式工厂方法模式结构工厂方法适合的应用场景工厂方法模式的优缺点练手题目题目描述输入描述输出描述**提示信息**解题&#xff1a; 工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例…

SQLite3的使用

14_SQLite3 SQLite3是一个嵌入式数据库系统&#xff0c;它的数据库就是一个文件。SQLite3不需要一个单独的服务器进程或操作系统&#xff0c;不需要配置&#xff0c;这意味着不需要安装或管理&#xff0c;所有的维护都来自于SQLite3软件本身。 安装步骤 在Linux上安装SQLite…

《概率论与数理统计》期末复习笔记_下

目录 第4章 随机变量的数字特征 4.1 数学期望 4.2 方差 4.3 常见分布的期望与方差 4.4 协方差与相关系教 第5章 大数定律和中心极限定理 5.1 大数定律 5.2 中心极限定理 第6章 样本与抽样分布 6.1 数理统汁的基本概念 6.2 抽样分布 6.2.1 卡方分布 6.2.2 t分布 6.…

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

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

技术打包 催化剂浸渍制作方法设备

网盘 https://pan.baidu.com/s/1Bybbyy5qEA2uTUlaELmWwg?pwdepdk 改性加氢处理催化剂载体、催化剂及其制备方法和应用.pdf 水滑石基催化剂在高浓度糖转化到1,2-丙二醇中的应用.pdf 海泡石负载铁锰双金属催化剂及其制备方法和应用.pdf 甘油氢解催化剂及其制备方法和应用.pdf 用…

【原理】机器学习中的最小二乘法公式推导过程

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是最小二乘法1.1. 什么是最小二乘法1.2. 最小二乘法的求解公式 二、最小二乘法求解公式的推导 最小二乘法是基本的线性求解问题之一&#xff0c;本文介绍最小二乘法的原理&#xff0c;和最小二法求解公式…

如何使用Spring Boot进行单元测试

如何使用Spring Boot进行单元测试 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot项目中进行单元测试&#xff0c;确保代码质量…

Week 4-杨帆-学习总结

目录 28 批量归一化批量规范化的背景和必要性批量规范化的实现理论探讨与争议遇到的问题&解决办法 29 残差网络 ResNet残差网络&#xff08;ResNet&#xff09;的核心概念函数类与嵌套函数类残差块&#xff08;Residual Blocks&#xff09;的结构与功能深度学习框架的应用模…

【学习笔记】Redis学习笔记——第2章:简单动态字符串

第2章&#xff1a;简单动态字符串 Redis用作键值对或AOF缓冲区的字符串为SDS(简单动态字符串)&#xff0c;而不是C语言传统字符串(只用作打印log等不会修改字符串值的地方)。 2.1 SDS的定义 {//SDS字符串长度&#xff08;buf数组中已使用的空间&#xff09;int len;//buf数组…

【Vue】Vue3基础

VUE3基础 1、简介2、创建工程2.1 基于vue-cli创建&#xff08;脚手架webpack&#xff09;2.2 基于vite创建&#xff08;推荐&#xff09;2.3 目录结构2.4 vscode插件推荐 3、核心语法3.1 选项式&#xff08;options API&#xff09;和组合式&#xff08;composition API&#x…

Arduino - LED 矩阵

Arduino - LED 矩阵 Arduino - LED Matrix LED matrix display, also known as LED display, or dot matrix display, are wide-used. In this tutorial, we are going to learn: LED矩阵显示器&#xff0c;也称为LED显示器&#xff0c;或点阵显示器&#xff0c;应用广泛。在…

scatterlist的相关概念与实例分析

概念 scatterlist scatterlist用来描述一块内存&#xff0c;sg_table一般用于将物理不同大小的物理内存链接起来&#xff0c;一次性送给DMA控制器搬运 struct scatterlist {unsigned long page_link; //指示该内存块所在的页面unsigned int offset; //指示该内存块在页面中的…

纯硬件FOC驱动BLDC

1. 硬件FOC 图 1 为采用 FOC 的方式控制 BLDC 电机的过程&#xff0c;经由 FOC 变换( Clark 与 Park 变换) &#xff0c;将三相电流转换为空间平 行电流 ID 与空间垂直电流 IQ。经过 FOC 逆变化逆( Clark 变换与逆 Park 变换) &#xff0c;将两相电流转换为三相电流用于控 制电…

喜茶新品被迫更名,内容营销专家刘鑫炜谈品牌定位敏锐度和适应性

喜茶&#xff0c;作为茶饮界的知名品牌&#xff0c;一直以其独特的创意和优质的产品受到消费者的喜爱。然而&#xff0c;近期喜茶推出的一款新品“小奶栀”却因其名称发音问题引发了不小的争议。 事件回顾 “小奶栀”这款新品在上市之初&#xff0c;以其独特的口感和创新的命名…