一篇文章带你搞定所有二叉树题型的递归思维(思路超详细)

news2025/7/18 4:24:07

文章目录

  • 🎀前言:
    • 🏅先在开头总结一下,二叉树解题的思维模式分两类:
    • 🎇先解释一下“前序位置”,“后序位置”的意思
      • 🏨举一个简单的例子:
  • 🪀下面通过两道例题,让你更加清晰的认识一下:
    • 示例一:求二叉树的最大高度
    • 示例二:翻转二叉树

🎀前言:

本篇博客目的是为了培养面对二叉树题型解题思维及去让你充分理解每个结点在递归之前、递归之后的位置的不同作用

🏅先在开头总结一下,二叉树解题的思维模式分两类:

这里是引用

🎇先解释一下“前序位置”,“后序位置”的意思

在这里插入图片描述
你也注意到了,只要是递归形式的遍历,都可以有前序位置后序位置
分别在递归之前递归之后

前序位置:就是刚进入一个节点(元素)的时候,
后序位置:就是即将离开一个节点(元素)的时候,那么进一步,
你把代码写在不同位置,代码执行的时机也不同:
在这里插入图片描述

🏨举一个简单的例子:

比如说,如果让你倒序打印一条单链表上所有节点的值,你怎么搞?

这里是引用

结合上面那张图,你应该知道为什么这段代码能够倒序打印单链表了吧。
那如果让你正序打印呢?

这里是引用

如过你理解了,那么恭喜你,你已经理解真谛了。那么二叉树也是一样的,它就只是多了一个叉而已
在这里插入图片描述
讲了这么多,这就是所有的核心内容了。,接下来就是如何来用,如何将这个知识带入做题思维里边去,就行了。
在这里插入图片描述

🪀下面通过两道例题,让你更加清晰的认识一下:

示例一:求二叉树的最大高度

在这里插入图片描述
你做这题的思路是什么?
显然遍历一遍二叉树,用一个外部变量记录每个节点所在的深度,
取最大值就可以得到最大深度了,这就是遍历二叉树计算答案的思路。
在这里插入图片描述

这个解法应该很好理解,但为什么需要在前序位置增加 depth,在后序位置减小 depth?

因为前面说了,前序位置是进入一个节点的时候,后序位置是离开一个节点的时候,
depth 记录当前递归到的节点深度,你把 traverse 理解成在二叉树上游走的一个指针,
所以当然要这样维护。

至于对 res 的更新,你放到前中后序位置都可以,只要保证在进入节点之后,
离开节点之前(即 depth 自增之后,自减之前)就行了。(优化部分,是考虑到每次递归都需要更新res的值,而树的最大高度是根到叶子节点中最深的)

🐕当然,你也很容易发现一棵二叉树的最大深度可以通过子树的最大深度推导出来,
这就是分解问题计算答案的思路

在这里插入图片描述
因为这个思路正确的核心在于,你确实可以通过子树的最大深度推导出原树的深度,
所以当然要首先利用递归函数的定义算出左右子树的最大深度,然后推出原树的最大深度,
主要逻辑自然放在后序位置
在这里插入图片描述

示例二:翻转二叉树

在这里插入图片描述

不难发现,只要把二叉树上的每一个节点的左右子节点进行交换,最后的结果就是完全翻转之后的二叉树。

那么现在开始在心中默念二叉树解题总纲:

1、这题能不能用「遍历」的思维模式解决?

可以,我写一个 traverse 函数遍历每个节点,让每个节点的左右子节点相互交换过来就行了
在这里插入图片描述

2、这题能不能用「分解问题」的思维模式解决?

可以,从叶子节点入手,先交换叶子节点的左右子树,
再进行倒数第二层父节点处理操作(这里假设它是棵满二叉树),
交换左右子树的叶子节点,再进行倒数第三层父节点处理操作,交换它的左右子树,…
直到根节点,交换它的左右子树
在这里插入图片描述

至此,我们在面对二叉树的所有问题时,都能够有思路了。
甚至你一眼就能看出别人用的是遍历二叉树的思路还是分解成左右子树来推出结果的思路
(主要看它的逻辑操作在‘前序位置’还是‘后序位置’写了,它就是哪种思路)

能够看到这里的朋友,谢谢你能够坚持看完,如果这个思维框架对你有所启发,
推荐你看一下《labuladong的算法笔记》(或者直接在哔站上看他讲的网课(讲的挺好的))

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

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

相关文章

HTTP 协议的基本格式(部分)

要想了解HTTP,得先知道什么是HTTP,那么HTTP是什么呢?HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。那什么是超文本呢?那就是除了文本,还有图片,声音,视频等。 …

Linux系统编程_进程:C程序空间分配、fork、wait、exec、system、popen

1. 进程相关概念(414.1) 问1. 什么是程序,什么是进程,有什么区别? 程序是静态的概念,gcc xxx.c –o pro,磁盘中生成pro文件,叫做程序进程是程序的一次运行活动,通俗点即…

LoongArch单机Ceph Bcache加速4K随机写性能测试

LoongArch单机Ceph Bcache加速4K随机写性能测试 两块HDD做OSD [rootceph01 ~]# fio -direct1 -iodepth128 -thread -rwrandwrite -ioenginelibaio -bs4k -size100G -numjobs1 -runtime600 -group_reporting -namemytest -filename/dev/rbd0 mytest: (g0): rwrandwrite, bs(R)…

System.exit()方法参数

说明文档:System (Java Platform SE 8 ) 终止当前正在运行的Java虚拟机。该参数用作状态代码;按照惯例,非零状态码表示异常终止。 此方法调用类Runtime中的exit方法。此方法从不正常返回。 调用System.exit(n)实际上等…

这应该是关于回归模型最全的总结了(附原理+代码)

本文将继续修炼回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归、人工神经网络、随…

个人博客系统的总结

个人博客系统 1、项目背景: 个人博客系统的兴起和发展是与信息技术和互联网的迅猛发展密切相关的。随着互联网的普及和数字化时代的到来,越来越多的人开始使用互联网平台来表达自己的观点、分享知识和展示个人创作。个人博客系统作为一种在线的个人信息…

C# CodeFormer Inpainting 人脸填充

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace CodeFormer_D…

Qt系列-QSplitter使用笔记

Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,如果有需要对界面进行切割,可以使用QSplitter进行简易的控件拼接。 注意:QSplitter 继承自QFrame,而QFrame又继承自QWidget,这点很重要…

数据结构----算法--五大基本算法

数据结构----算法–五大基本算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况,只考虑眼前的这一步,在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分治法:分而治之 将一个问题拆解成若干个解决方式…

代码随想录第44天 | ● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

1143.最长公共子序列 //*** param {string} text1* param {string} text2* return {number}*/ var longestCommonSubsequence function(text1,text2) {let dp new Array(text2.length1)dp.fill(0)for(let i 1; i < text1.length; i) {// 这里pre相当于 dp[i - 1][j - 1]…

这些 channel 用法你都用起来了吗?

channel 是什么&#xff1f; channel 是GO语言中一种特殊的类型&#xff0c;是连接并发goroutine的管道 channel 通道是可以让一个 goroutine 协程发送特定值到另一个 goroutine 协程的通信机制。 关于 channel 的原理&#xff0c;channel通道需要注意的地方&#xff0c;之前…

Kotlin中布尔类型、字符类型、字符串类型和数组类型

在Kotlin中&#xff0c;布尔类型、字符类型、字符串类型和数组类型是常用的数据类型之一。下面我将对它们进行详细描述并提供示例代码。 布尔类型&#xff08;Boolean&#xff09;&#xff1a; 布尔类型表示逻辑值&#xff0c;只有两个可能的取值&#xff1a;true和false。在K…

我的创作纪念日———C/C++之动态内存管理

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.为什么要有动态内存分配…

浅谈工业企业能源管理软件的应用

安科瑞 崔丽洁 摘要&#xff1a;在工业企业中&#xff0c;能源是企业正常工作的根本保障&#xff0c;同时也是工业企业成本的主要构成部分。工业企业在相应的工作和使用的能源包括水、电、气等。在过去&#xff0c;企业对能源消耗的关注度比较低&#xff0c;更多的强调安全与保…

二分查找算法(Python)

目录 1、概念 2、思路 3、实现算法 1、概念 二分查找又称折半查找&#xff0c;它是一种效率较高的查找方法 原理&#xff1a;首先&#xff0c;假设表中元素是按升序排列&#xff0c;将表中间位置记录的关键字与查找关键字比较&#xff0c;如果两者相等&#xff0c;则查找成…

从入门到进阶 之 ElasticSearch 文档、分词器 进阶篇

&#x1f339; 以上分享 ElasticSearch 文档、分词器 进阶篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏&#…

通达OA 2016网络智能办公系统 handle.php SQL注入漏洞

一、漏洞描述 北京通达信科科技有限公司通达OA2016网络智能办公系统 handle.php 存在sql注入漏洞&#xff0c;攻击者可利用此漏洞获取数据库管理员权限&#xff0c;查询数据、获取系统信息&#xff0c;威胁企业单位数据安全。 二、网络空间搜索引擎查询 fofa查询 app"T…

攻防演练蓝队|Windows应急响应入侵排查

文章目录 日志分析web日志windows系统日志 文件排查进程排查新增、隐藏账号排查启动项/服务/计划任务排查工具 日志分析 web日志 dirpro扫描目录&#xff0c;sqlmap扫描dvwa Python dirpro -u http://192.168.52.129 -b sqlmap -u "http://192.168.52.129/dvwa/vulnera…

牛客:FZ12 牛牛的顺时针遍历

FZ12 牛牛的顺时针遍历 文章目录 FZ12 牛牛的顺时针遍历题目描述题解思路题解代码 题目描述 题解思路 通过一个变量来记录当前方向&#xff0c;遍历矩阵&#xff0c;每次遍历一条边&#xff0c;将该边的信息加入到结果中 题解代码 func spiralOrder(matrix [][]int) []int {…

小程序-uni-app:将页面(html+css)生成图片/海报/名片,进行下载 保存到手机

一、需要描述 本文实现&#xff0c;uniapp微信小程序&#xff0c;把页面内容保存为图片&#xff0c;并且下载到手机上。 说实话网上找了很多资料&#xff0c;但是效果不理想&#xff0c;直到看了一个开源项目&#xff0c;我知道可以实现了。 本文以开源项目uniapp-wxml-to-can…