代码随想录刷题Day48

这次博客主要是对做过的关于二叉树系列的题目进行整理和分类。

二叉树,要处理整个树,一般少不了遍历。遍历主要可以分为:递归系列、层序遍历。

如果不遍历的话,那就是处理特殊的树了,比如完全二叉树。

递归系列

基本的递归
  • 基本遍历:先序、后序、中序
    • 如果使用迭代的方法,要注意节点入栈顺序和遍历顺序相反,比如,先序遍历,入栈顺序是右左中。
    • 相关的题目有:
      • 左叶子之和
        • 遍历 +左叶子判断
      • 合并二叉树
        • 同步遍历两棵树
      • BST转换为累加树
        • 本质上是右中左的遍历操作
  • 翻转左右子树
    • 递归处理左右子树后,再对根节点的左右节点交换
  • 对称二叉树/相同的树
    • 两棵树内侧和内侧,外侧和外侧的递归比较
  • 树的最大深度
    • 也是求树高度,这可以用在判断平衡二叉树中,用个简单if-else可以解决,左右子树的最大深度+1
  • 树的最小深度
    • 层序遍历到出现第一个叶子节点,这个方法会更省事些,因为后面遇到的节点都不用遍历
    • 但是如果用递归的方法,得把所有节点都遍历完才能确定哪个叶子节点深度最小
  • 平衡二叉树判断
    • 主要还是会求树高,然后再递归判断树的高度差
额外栈

这个方法是指使用一个和遍历树节点同步的栈来记录其他信息,这个方法也可以使用回溯的方法来替代解决,但是回溯比较繁琐,目前主要还是优先使用这种思路。

  • 二叉树的所有路径
    • 用一个和遍历树同步的字符串栈,来记录深度遍历过程中从根节点到叶子节点的发展路径
  • 找树的最左下角的值
    • 这道题使用层序遍历也是可以的,如果要使用额外栈,那就是用于记录节点的深度信息
  • 路径总和
    • 这种求树的路径信息,应该可以第一反应,使用额外栈的方式解决,这道题是用于记录深度遍历过程中从根节点到当前节点的路径上的节点和
构造树

构造树是一个递归的过程,确定根节点,划分出左子树和右子树的范围是重点。

  • 从中序和后序遍历序列构造二叉树
    • 后序遍历结果提供根节点的信息,中序遍历结果提供左右子树范围的信息
  • 最大二叉树
    • 序列最大值作为根节点,左右子树序列可以自然获得
  • 从有序数组中构造二叉搜索树
    • 按照平衡的定义,可以知道根节点是序列的中间元素,左右子树序列则是中间元素两侧的序列
LCA 最近公共祖先

因为代码随想录刷题几乎都是链表的树结构,所以倍增的解法在这里难施拳脚,主要还是根据最近公共祖先的定义来解决。

  • 二叉树的公共祖先(不是很熟练):
    • 回溯时候确定祖先节点,递归的终止条件是遇到空节点或者两个孩子节点。
    • 接着看两子树中是否可以找到目标孩子节点,如果两个子树都可以找到,说明该节点是根节点,可以直接返回当前root节点了。
  • 二叉搜索树LCA:
    • 可以直接依赖BST的性质了,遍历方向分叉之处就是根节点。

广度优先

层序遍历

层序遍历,是使用队列来记录一层的节点,并记住该层节点数目,每层循环上一层出队下一层入队。

这在高度计算,层的平均值,层的最大值,右视图,next指针在每一层中添加,这些题目中优先考虑使用队列层序遍历。

特殊的二叉树

完全二叉树

有道题是求完全二叉树的节点,如果要充分利用上完全二叉树的定义的话,就得借助满二叉树的概念,满二叉树作为递归结束的终止条件,满二叉树只需要根据最左路径和最右路径的深度进行比较可以得出判断结果。

二叉搜索树
  • BST的验证
    • 这道题如果老实按照定义来递归验证就中招了,因为会出现右子树的左孩子节点小于根节点的情况。所以最保险的做法是使用中序遍历,查看结果是否是非递减的序列
  • BST的最小绝对差
    • 中序遍历得到的序列,A节点的相邻两个节点一定是树中所有节点里距离A最近的两个节点。再求一次相邻节点的差值就好
  • BST的插入操作
    • 先找到节点插入的位置(有种二分法的感觉),然后挂上去就好
  • BST的删除操作
    • 删除节点分类:叶子节点、单孩子节点、双孩子节点
  • BST修剪操作
    • 注意修剪区间左端时,不要忘记对右子树继续修剪,同理,修剪区间右端时不要忘记对左子树的继续修剪

感觉自己这个分类还是比较凌乱,但至少把刷过的那些题的大致类型都已经列出来了。

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

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

相关文章

汽车工装结构件3D扫描尺寸测量公差比对-中科米堆CASAIM

汽车制造过程中,工装结构件的尺寸精度对整车装配质量和生产进度有重要影响。传统测量工具如卡尺和三坐标测量机采用接触式工作方式,检测过程耗时较长,对于具有复杂曲面特征的工件,难以全面获取尺寸数据。激光三维扫描技术改变了传…

Docker Pull 代理配置方法

本文介绍通过网络代理加速Docker镜像拉取的方法。 配置方法 当执行docker pull从Docker Hub 拉取镜像时,其网络连接由守护进程docker daemon进行维护。 要修改其代理设置,可配置其systemd服务,步骤如下: (1&#xf…

机电装置:从基础原理到前沿应用的全方位解析

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 机电装置的基本概念与发展历程 机电装置(Mechatronic D…

《SVA断言系统学习之路》【03】关于布尔表达式

序列中使用的表达式基于其所含变量的采样值进行评估。表达式评估的结果为布尔值,其解释方式与过程性if语句条件中的表达式完全相同:若表达式计算结果为X、Z 或 0,则被解释为假;否则即为真。但是,对可出现在并发断言中的…

指针高级(2)

6.数组指针#include <stdio.h> int main() {/*练习&#xff1a;利用指针遍历数组*///1.定义数组int arr[] { 10,20,30,40,50 };int len sizeof(arr) / sizeof(int);//2.获取数组的指针//实际上获取的&#xff1a;数组的首地址int* p1 arr;int* p2 &arr[0];printf…

如何高效记单词之:抓住首字母——以find、fund、fond、font为例

find、fund、fond、font这几个单词&#xff0c;你都认识吗&#xff1f;这几个单词&#xff0c;意思大体如下&#xff1a; find v.找到&#xff1b;发现fund n.基金fond a.喜欢的&#xff1b;喜爱的&#xff1b;深情的font n.字体&#xff0c;字型&#xff0c;字形 这几个单词在…

Ubuntu下把 SD 卡格式化为 FAT32

在 Ubuntu 下把 SD 卡格式化为 FAT32&#xff0c;按下面做&#xff08;会抹掉整卡数据⚠️&#xff09;&#xff1a; 1) 找到你的 SD 卡设备名 lsblk -p记下整盘设备&#xff0c;比如 /dev/sdb&#xff08;USB 读卡器常见&#xff09;或 /dev/mmcblk0&#xff08;内置读卡器&am…

涉私数据安全与可控匿名化利用机制研究(上)

文章目录前言一、涉私数据的概述及分类&#xff08;一&#xff09;涉私数据的“知情同意原则”&#xff08;二&#xff09;涉私数据的分类二、涉私数据可控匿名化利用机制&#xff08;一&#xff09;数据产品与涉私数据的利用形式&#xff08;二&#xff09;通过可信数据空间受…

Redis 的跳跃表:像商场多层导航系统一样的有序结构

目录 一 、从 "超市货架" 的痛点看跳跃表的价值 1.1、跳跃表与商场导航系统的结构对应 1. 1.1、zskiplistNode&#xff1a;带导航标记的 "商品"&#xff08;跳跃表节点&#xff09; 1.1.1.1、level []&#xff1a;商品上的多层导航标记 1.1.1.2、back…

小程序点击之数据绑定

<return /><view class"all-wrap" style"padding-top:{{topHeight}}px;"><view class"my-title">我的收藏</view><scroll-viewclass"collect-list-container"scroll-yscroll-top"{{scrollTop}}"…

数据结构——顺序表和单向链表(2)

目录 前言 一、单向链表 1、基本概念 2、单向链表的设计 &#xff08;1&#xff09;节点设计 &#xff08;2&#xff09;初始化空单向链表 &#xff08;3&#xff09;、初始化数据节点 &#xff08;4&#xff09;数据节点 &#xff08;5&#xff09;判断链表是否为空 …

More Effective C++ 条款26:限制某个类所能产生的对象数量

More Effective C 条款26&#xff1a;限制某个类所能产生的对象数量核心思想&#xff1a;通过控制类的实例化过程&#xff0c;限制程序中该类的对象数量&#xff0c;可以防止资源过度使用&#xff0c;确保系统资源合理分配&#xff0c;并实现单例或有限实例模式。 &#x1f680…

CMS系统维护中常见的安全威胁及防护指南!

内容管理系统&#xff08;CMS&#xff09;已成为网站建设的核心工具&#xff0c;但随之而来的安全风险却常被低估。超过70%的网站使用CMS构建&#xff0c;而其中近半数曾遭遇安全漏洞威胁。作为运维人员和开发者&#xff0c;了解这些安全威胁并采取相应防护措施至关重要。 一、…

springboot knife4j 接口文档入门与实战

Spring Boot3 Knife4j 项目地址https://gitee.com/supervol/loong-springboot-study&#xff08;记得给个start&#xff0c;感谢&#xff09;Knife4j 介绍在国内 Java 开发领域&#xff0c;Knife4j 是一款广受欢迎的 API 文档工具&#xff0c;它基于 OpenAPI 规范&#xff0c;在…

Spring Boot 事务失效的八大原因及解决方案详解

在 Spring Boot 项目开发中&#xff0c;声明式事务管理通过 Transactional 注解提供了极大的便利。但许多开发者都曾遇到过事务不生效的困扰。本文将详细分析导致 Spring Boot 事务失效的八大常见情况&#xff0c;并提供相应的解决方案。1. 数据库引擎不支持事务问题分析&#…

数据结构:顺序栈与链栈的原理、实现及应用

数据结构详解&#xff1a;顺序栈与链栈的原理、实现及应用 1. 引言&#xff1a;栈的核心概念 栈&#xff08;Stack&#xff09;是一种重要的线性数据结构&#xff0c;它遵循后进先出&#xff08;Last In First Out, LIFO&#xff09;的原则。这意味着最后一个被添加到栈中的元素…

apipost 8.x 脚本循环调用接口

apipost 8.x 脚本循环调用接口背景实现先说整体逻辑&#xff1a;最后背景 上周为了找某OA 偶尔出现的诡异现象&#xff0c;需要用测试工具来压测&#xff0c;看看这个问题能否重现。以前用过Jmeter&#xff0c;但是没有装&#xff0c;正好有个国产的apipost看看如何&#xff1…

STM32 - Embedded IDE - GCC - 使用 GCC 链接脚本限制 Flash 区域

导言如上所示&#xff0c;Keil限制flash区域只需要在IROM1里将Start框框与Size框框填入具体信息即可。比如bootloader程序一般从0x8000000开始&#xff0c;大小0x10000&#xff08;64KB&#xff09;。此时&#xff0c;flash的范围被限制在0x8000000 ~ 0x800FFFF。 另外&#xf…

Jenkins和Fastlane的原理、优缺点、用法、如何选择

Jenkins 和 Fastlane 是软件开发中用于自动化流程的工具一、Jenkins实现自动化打包1.1具体实现步骤安装与配置&#xff1a;首先在服务器上安装 Jenkins&#xff0c;可以通过官方提供的安装包进行安装&#xff0c;支持多种操作系统。安装完成后&#xff0c;通过 Web 界面进行初始…

DOM常见的操作有哪些?

1.DOM文档对象模型&#xff08;DOM&#xff09;是HTML和XML文档的编程接口它提供了对文档结构化表述&#xff0c;并定义了一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式和内容任何HTML或XML文档都可以用DOM表示一个由节点构成的层级结…