二叉树:总结篇!【需要掌握的二叉树技能都在这里啦】

news2024/11/20 8:40:47

文章目录

  • 前言
  • 二叉树理论基础
    • 二叉树理论基础
    • 二叉树的遍历方式
      • 深度优先遍历
      • 广度优先遍历
    • N叉树的遍历方式
    • 求二叉树的属性
      • 二叉树:是否对称
      • 二叉树:求最大深度
      • 二叉树:求最小深度
      • 二叉树:求有多少个节点
      • 二叉树:是否平衡
      • 二叉树:找所有路径
      • 二叉树:递归中如何隐藏着回溯
      • 二叉树:求左叶子之和
      • 二叉树:求左下角的值
      • 二叉树:求路径总和3
  • 二叉树的修改与构造
    • 翻转二叉树
    • 构造二叉树
    • 构造最大的二叉树
    • 合并两个二叉树
  • 求二叉搜索树的属性
    • 二叉搜索树中的搜索
    • 是不是二叉搜索树
    • 求二叉搜索树的最小绝对差
    • 求二叉搜索树的众数
    • 二叉搜索树转成累加树
  • 二叉树公共祖先问题
    • 二叉树的公共祖先问题
    • 二叉搜索树的公共祖先问题
  • 二叉搜索树的修改与构造
    • 二叉搜索树中的插入操作
    • 二叉搜索树中的删除操作
    • 修剪二叉搜索树
    • 构造二叉搜索树
  • 最后总结

前言

不知不觉二叉树专题已经刷了30多道经典题目。

在每一道二叉树的题目中,我们都使用了递归三部曲来分析题目,相信大家以后看到二叉树,看到递归,都会想:

1. 返回值、参数是什么?
2. 终止条件是什么?
3. 单层逻辑是什么?

下面我们把分析过的题目分门别类,可以帮助大家循序渐进学习二叉树,也方便快速复习,看到一个标题,就回想一下对应的解题思路,这样很快就可以系统性的复习一遍二叉树了。

文章的顺序,实际就是循序渐进的,所以如下分类基本就是按照文章发文顺序来的,我再做一个系统性的分类。

二叉树理论基础

二叉树理论基础

关于二叉树,我们在二叉树理论基础一文中了解到:二叉树的种类、存储方式、遍历方式、定义方式

二叉树的遍历方式

深度优先遍历

  • 二叉树:二叉树的前中后序遍历(递归法)( 含leetcode上三道【前中后序】遍历题目):递归三部曲初次亮相

  • 递归:什么是递归中我们深入介绍了递归,总结了不少递归思想,模拟了递归过程。

  • 递归:中序遍历二叉树全过程图解中我们以二叉树的中序遍历为例,再次模拟跟进了递归流程。

  • 递归:再上两道简单递归题,熟练树的递归流程。通过两道题深入理解二叉树递归

  • 二叉树:熟悉递归法后,我们又介绍了二叉树的迭代法遍历:通过栈模拟递归。二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)

广度优先遍历

  • 二叉树除了深度优先外,还有一种常见遍历方式:广度优先遍历:通过队列模拟。二叉树的层序遍历(含八道leetcode相关题目)

N叉树的遍历方式

二叉树遍历熟练了,那么N叉树遍历基本也就通了,剧透一下:后面要讲的回溯专题和N叉树的遍历有异曲同工之妙。N叉树的前序与后续遍历(含两道leetcode题)

求二叉树的属性

二叉树:是否对称

101. 对称二叉树(共含三道leetcode题)

递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
迭代:使用队列/栈将两个节点顺序放入容器中进行比较

二叉树:求最大深度

104. 二叉树的最大深度(包括N叉树的最大深度)

递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
迭代:层序遍历

二叉树:求最小深度

111. 二叉树的最小深度

递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
迭代:层序遍历

二叉树:求有多少个节点

222. 完全二叉树的节点个数

递归:后序,通过递归函数的返回值计算节点数量
迭代:层序遍历

二叉树:是否平衡

110. 平衡二叉树

递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
迭代:效率很低,不推荐

二叉树:找所有路径

初识回溯:257. 二叉树的所有路径(回溯详解)
递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
迭代:一个栈模拟递归,一个栈来存放对应的遍历路径

二叉树:递归中如何隐藏着回溯

257. 二叉树的所有路径(回溯详解)

详解二叉树:找所有路径中递归如何隐藏着回溯

二叉树:求左叶子之和

404. 左叶子之和

递归:后序,必须三层约束条件,才能判断是否是左叶子。
迭代:直接模拟后序遍历

二叉树:求左下角的值

513. 找树左下角的值

递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
迭代:层序遍历找最后一行最左边

二叉树:求路径总和3

112. 路径总和
递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与构造

翻转二叉树

226. 翻转二叉树之多种解法(递归法、深度优先(迭代法)、广度优先【层序遍历】)
递归:前序,交换左右孩子
迭代:直接模拟前序遍历

构造二叉树

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

递归:前序,重点在于找分割点,分左右区间构造
迭代:比较复杂,意义不大

构造最大的二叉树

654. 最大二叉树

递归:前序,分割点为数组最大值,分左右区间构造
迭代:比较复杂,意义不大

合并两个二叉树

617. 合并二叉树

递归:前序,同时操作两个树的节点,注意合并的规则
迭代:使用队列,类似层序遍历

求二叉搜索树的属性

二叉搜索树中的搜索

700. 二叉搜索树中的搜索

递归:二叉搜索树的递归是有方向的
迭代:因为有方向,所以迭代法很简单

是不是二叉搜索树

98. 验证二叉搜索树

递归:中序,相当于变成了判断一个序列是不是递增的
迭代:模拟中序,逻辑相同

求二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差

递归:中序,双指针操作(记录前一个遍历节点的技巧
迭代:模拟中序,逻辑相同

求二叉搜索树的众数

501. 二叉搜索树中的众数

递归:中序,清空结果集的技巧,遍历一遍便可求众数集合

二叉搜索树转成累加树

538. 把二叉搜索树转换为累加树

递归:中序,双指针操作累加

迭代:模拟中序,逻辑相同

二叉树公共祖先问题

二叉树的公共祖先问题

236. 二叉树的最近公共祖先

递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
迭代:不适合模拟回溯

二叉搜索树的公共祖先问题

235. 二叉搜索树的最近公共祖先

递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
迭代:按序遍历

二叉搜索树的修改与构造

二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作

递归:顺序无所谓,通过递归函数返回值添加节点
迭代:按序遍历,需要记录插入父节点,这样才能做插入操作

二叉搜索树中的删除操作

450. 删除二叉搜索树中的节点

递归:前序,想清楚删除非叶子节点的情况
迭代:有序遍历,较复杂

修剪二叉搜索树

669. 修剪二叉搜索树

递归:前序,通过递归函数返回值删除节点
迭代:有序遍历,较复杂

构造二叉搜索树

108. 将有序数组转换为二叉搜索树

递归:前序,数组中间节点分割
迭代:较复杂,通过三个队列来模拟

最后总结

在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,得出大体分类。

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

  • 二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,而单纯求深度就可以用前序,二叉树:找所有路径也用了前序,这是为了方便让父节点指向子节点。

所以求普通二叉树的属性还是要具体问题具体分析。
在这里插入图片描述

最后,二叉树系列就这么完美结束了,接下来我们又要开始新的系列了「回溯算法」!

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

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

相关文章

外贸财务软件精选,提升管理效率与精准度

ZohoBooks、QuickBooks等六款会计软件各具特色,支持多币种、国际化等功能,适合不同规模外贸企业。其中,ZohoBooks功能全面,QuickBooks操作简便,SageIntacct适合复杂业务,用友U8和金蝶K/3面向中大型企业&…

CommandLineRunner 和 ApplicationRunner

CommandLineRunner 和 ApplicationRunner 背景: 项目启动之前,预先加载数据。比如,权限容器、特殊用户数据等。通常我们可以使用监听器、事件来操作。但是,springboot提供了一个简单的方式来实现此类需求,即&#xf…

《Linux从小白到高手》理论篇(九):Linux的资源监控管理

本篇介绍Linux的资源监控管理。 1、CPU 资源管理 进程调度: Linux 采用公平的进程调度算法,确保每个进程都能获得合理的 CPU 时间。调度算法会根据进程的优先级、等待时间等因素来决定哪个进程获得 CPU 使用权。 可以通过调整进程的优先级来影响其获得…

C++继承实例讲解

C类继承的基本概念 base class,基类、父类 derived class,派生类、子类 C中的类可以扩展,创建保留基类特征的新类,这个过程称之为继承。类继承也可以描述为:派生类继承基类的成员,并在其上添加自己的成员…

【hot100-java】【单词搜索】

回溯 回溯可以使用DFS剪枝解决 class Solution {public boolean exist(char[][] board, String word) {char[] wordsword.toCharArray();for(int i0;i<board.length;i){for(int j0;j<board[0].length;j){if(dfs(board,words,i,j,0)) return true;}}return false;}boolean…

关于Elastic Search与MySQL之间的数据同步

目录 前言 思路分析 同步调用 异步通知 监听binlog 选择 实现数据同步 思路 运行项目 声明交换机、队列 1&#xff09;引入依赖 2&#xff09;声明队列交换机名称 3&#xff09;声明队列交换机 发送MQ消息 接收MQ消息 前言 Elastic Search中的酒店数据来自于MyS…

TypeScript 算法手册【插入排序】

文章目录 TypeScript 算法手册 - 插入排序1. 插入排序简介1.1 插入排序定义1.2 插入排序特点 2. 插入排序步骤过程拆解2.1 选择当前元素2.2 寻找插入位置2.3 插入元素 3. 插入排序的优化3.1 二分查找插入排序案例代码和动态图 4. 插入排序的优点5. 插入排序的缺点总结 【 已更新…

48.哀家要长脑子了!

1.376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 看问题抓本质 本质&#xff01;&#xff01;识别和追踪数组中元素值的变化趋势。摆动序列是什么&#xff0c;什么是摆动序列&#xff0c;就是差值正负正负的来&#xff0c;最后要求摆动序列的子序列的长度的话&#x…

如何在KEIL的Debug模式下导出数据

我们知道&#xff0c;利用Keil编写程序时&#xff0c;可以实时显示数据的值&#xff0c;如上图所示&#xff0c;实时显示Voltage和fre的值&#xff0c;那如何导出该数据呢&#xff0c;下边进行详细说明。 首先&#xff0c;进入Debug模式&#xff0c;点击调试里边的函数编辑器。…

计算机毕业设计 基于Python的摄影平台交流系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

GPU、AI、CUDA

文章目录 1.千层面层多层 2. CPU与GPU架构差异3.大规模矩阵操作4.专为并行计算设计的库 1.千层面 神经网络的本质是千层面&#xff0c;由一层一层的线性代数方程组成&#xff0c;每个方程都表示一段数据与另一段数据相关的可能性 层 神经网络的每一次层可以看作是一次线性代…

泰勒图 ——基于相关性与标准差的多模型评价指标可视化比较-XGBoost、sklearn

1、基于相关性与标准差的多模型评价指标可视化比较 # 数据读取并分割 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split plt.rcParams[font.family] = Times New Roman plt.rcParams[axes.unic…

工单管理系统功能解析,企业运营效率提升利器

工单管理系统如ZohoDesk提供工单生成分配、跟踪、数据分析、客户服务管理及移动兼容等功能&#xff0c;提升效率、增强服务、便于监管和降低成本&#xff0c;是现代企业信息化建设的重要部分。 一. 工单管理系统一般有哪些功能 1. 工单生成与分配 工单管理系统的基础功能是创…

Webstorm 中对 Node.js 后端项目进行断点调试

首先&#xff0c;肯定需要有一个启动服务器的命令脚本。 然后&#xff0c;写一个 debug 的配置&#xff1a; 然后&#xff0c;debug 模式 启动项目和 启动调试服务&#xff1a; 最后&#xff0c;发送请求&#xff0c;即可调试&#xff1a; 这几个关键按钮含义&#xff1a; 重启…

8.数据结构与算法-双向链表

双向链表的结构定义 从第二个指针找到下一个元素 从第一个指针找到上一个元素 双向循环列表 从第二个指针找到下一个元素&#xff0c;第二个指针可以往前循环找到链表开头 从第一个指针找到上一个元素&#xff0c;第一个指针可以往前循环昭侯链表结尾 双向链表的插入 双向链…

NLP:BERT的介绍并使用该模型计算文本相似度

1. BERT 1.1 Transformer Transformer架构是一种基于自注意力机制(self-attention)的神经网络架构&#xff0c;它代替了以前流行的循环神经网络和长短期记忆网络&#xff0c;已经应用到多个自然语言处理方向。   Transformer架构由两个主要部分组成&#xff1a;编码器(Encod…

uniapp中实现评分组件,多用于购买商品后,对商品进行评价等场景

前言 uni-rate是uniapp框架中提供的一个评分组件。它可以用于用户评价、打分等场景。uni-rate组件可以根据设定的星星总数&#xff0c;展示用户评分的效果&#xff0c;用户可以通过点击星星或滑动星星的方式进行评分。同时&#xff0c;uni-rate组件也支持自定义星星图标、星星…

关于CSS Grid布局

关于CSS Grid布局 实际效果参考 参考代码 <template><view class"baseInfo"><up-image class"cover" height"160rpx" width"120rpx" :src"bookInfo.cover"><template #error><view style"…

疾风大模型气象,基于气象数据打造可视化平台

引言 随着气象数据的广泛应用&#xff0c;越来越多的行业依赖天气预报与气候分析来做出决策。从农业、航空、能源到物流&#xff0c;气象信息无时不刻影响着各行各业的运作。然而&#xff0c;气象数据本身复杂且多样&#xff0c;如何将这些数据转化为直观、易于理解的图形和信…

MetaJUI v0.4 遇到的一些问题及解决办法记录

1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载&#xff0c;https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压&#xff0c;用Unity3d 打开项目&#xff0c;会出现如下问题&#xff0c;按照图中提示操作即可。 4、打开工程后会出现…