首页 > 其他分享 >分享丨【题单】链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)

分享丨【题单】链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)

时间:2024-08-30 11:47:15浏览次数:12  
标签:二叉 链表 会员 二叉树 搜索 节点 指针

作者:灵茶山艾府
链接:https://leetcode.cn/circle/discuss/K0n2gO/

一、链表
注:由于周赛中的链表题可以转成数组处理,难度比直接处理链表低,故不标明难度分。

带着问题去做下面的题目:

在什么情况下,要用到哨兵节点(dummy node)?
在什么情况下,循环条件要写 while (node != null)?什么情况下要写 while (node.next != null)?
§1.1 遍历链表
1290. 二进制链表转整数
2058. 找出临界点之间的最小和最大距离
2181. 合并零之间的节点
725. 分隔链表
817. 链表组件
3062. 链表游戏的获胜者(会员题)
3063. 链表频率(会员题)
§1.2 删除节点
视频讲解【基础算法精讲 08】

203. 移除链表元素
3217. 从链表中移除在数组中存在的节点
83. 删除排序链表中的重复元素
82. 删除排序链表中的重复元素 II
237. 删除链表中的节点
1669. 合并两个链表
2487. 从链表中移除节点
1836. 从未排序的链表中移除重复元素(会员题)
§1.3 插入节点
2807. 在链表中插入最大公约数
147. 对链表进行插入排序
LCR 029. 循环有序列表的插入
708. 循环有序列表的插入(会员题)
2046. 给按照绝对值排序的链表排序(会员题)
§1.4 反转链表
视频讲解【基础算法精讲 06】

206. 反转链表
92. 反转链表 II
24. 两两交换链表中的节点
25. K 个一组翻转链表
2074. 反转偶数长度组的节点
§1.5 前后指针
视频讲解【基础算法精讲 08】

19. 删除链表的倒数第 N 个结点
61. 旋转链表
1721. 交换链表中的节点
1474. 删除链表 M 个节点之后的 N 个节点(会员题)
§1.6 快慢指针
视频讲解【基础算法精讲 07】

876. 链表的中间结点
2095. 删除链表的中间节点
234. 回文链表
2130. 链表最大孪生和
143. 重排链表
141. 环形链表
142. 环形链表 II
457. 环形数组是否存在循环
2674. 拆分循环链表(会员题)
§1.7 双指针
328. 奇偶链表
86. 分隔链表
160. 相交链表
§1.8 合并链表
2. 两数相加
445. 两数相加 II
2816. 翻倍以链表形式表示的数字
21. 合并两个有序链表
369. 给单链表加一(会员题)
1634. 求两个多项式链表的和(会员题)
§1.9 分治
23. 合并 K 个升序链表 也可以用堆
148. 排序链表
§1.10 综合应用
1019. 链表中的下一个更大节点
1171. 从链表中删去总和值为零的连续节点
707. 设计链表
146. LRU 缓存
460. LFU 缓存
432. 全 O(1) 的数据结构
1206. 设计跳表
§1.11 其他
138. 随机链表的复制
382. 链表随机节点
430. 扁平化多级双向链表
1265. 逆序打印不可变链表(会员题)
二、二叉树
学习递归,从二叉树开始。

晕递归的同学,请先看视频讲解【基础算法精讲 09】,欢迎点赞~

带着问题去做下面的题目:

一般来说,DFS 的递归边界是空节点。在什么情况下,要额外把叶子节点作为递归边界?
在什么情况下,DFS 需要有返回值?什么情况下不需要有返回值?
在什么情况下,题目更适合用自顶向下的方法解决?什么情况下更适合用自底向上的方法解决?
§2.1 遍历二叉树
144. 二叉树的前序遍历
94. 二叉树的中序遍历
145. 二叉树的后序遍历
872. 叶子相似的树 1288
LCP 44. 开幕式焰火
404. 左叶子之和
671. 二叉树中第二小的节点
1469. 寻找所有的独生节点(会员题)
1214. 查找两棵二叉搜索树之和(会员题)
§2.2 自顶向下 DFS
在「递」的过程中维护值。

有些题目自顶向下和自底向上都可以做。有些题目也可以用 BFS 做。

104. 二叉树的最大深度
111. 二叉树的最小深度
112. 路径总和
129. 求根节点到叶节点数字之和
199. 二叉树的右视图
1448. 统计二叉树中好节点的数目 1360
1457. 二叉树中的伪回文路径 1405
1315. 祖父节点值为偶数的节点和 1427
988. 从叶结点开始的最小字符串 1429
1026. 节点与其祖先之间的最大差值 1446
1022. 从根到叶的二进制数之和 1462
623. 在二叉树中增加一行
1372. 二叉树中的最长交错路径 1713
971. 翻转二叉树以匹配先序遍历 1787 有简单做法
2689. 从 Rope 树中提取第 K 个字符(会员题)
298. 二叉树最长连续序列(会员题)
1430. 判断给定的序列是否是二叉树从根到叶的路径(会员题)
545. 二叉树的边界(会员题)
§2.3 自底向上 DFS
在「归」的过程中计算。

如何灵活运用递归?【基础算法精讲 10】

104. 二叉树的最大深度
111. 二叉树的最小深度
965. 单值二叉树 1178
100. 相同的树
101. 对称二叉树
951. 翻转等价二叉树
1379. 找出克隆二叉树中的相同节点
110. 平衡二叉树
226. 翻转二叉树
617. 合并二叉树
2331. 计算布尔二叉树的值 1304
508. 出现次数最多的子树元素和
563. 二叉树的坡度
606. 根据二叉树创建字符串
2265. 统计值等于子树平均值的节点数 1473
1026. 节点与其祖先之间的最大差值
1339. 分裂二叉树的最大乘积 1675
1372. 二叉树中的最长交错路径 1713
1145. 二叉树着色游戏 1741
572. 另一棵树的子树 做到 O(n) 时间
1530. 好叶子节点对的数量 做到低于 O(n^2) 时间
LCP 67. 装饰树
298. 二叉树最长连续序列(会员题)
250. 统计同值子树(会员题)
1973. 值等于子节点值之和的节点数量(会员题)
663. 均匀树划分(会员题)
1120. 子树的最大平均值(会员题)
2792. 计算足够大的节点数(会员题)
333. 最大二叉搜索子树(会员题)
366. 寻找二叉树的叶子节点(会员题)
156. 上下翻转二叉树(会员题)
1612. 检查两棵二叉表达式树是否等价(会员题)
§2.4 自底向上 DFS:删点
814. 二叉树剪枝 1380
1325. 删除给定值的叶子节点 1407
1110. 删点成林 1511
§2.5 有递有归
538. 把二叉搜索树转换为累加树 1375 也可以用外部变量记录和
1038. 从二叉搜索树到更大和树 同 538 题
865. 具有所有最深节点的最小子树 1534 也可以自底向上
1080. 根到叶路径上的不足节点 1805
§2.6 直径
视频讲解【基础算法精讲 23】

543. 二叉树的直径
687. 最长同值路径
124. 二叉树中的最大路径和
2385. 感染二叉树需要的总时间 1711
549. 二叉树最长连续序列 II(会员题)
另见下文:一般树的直径。

§2.7 回溯
257. 二叉树的所有路径
113. 路径总和 II
437. 路径总和 III
§2.8 最近公共祖先
视频讲解【基础算法精讲 12】

235. 二叉搜索树的最近公共祖先
236. 二叉树的最近公共祖先
1123. 最深叶节点的最近公共祖先 1607
2096. 从二叉树一个节点到另一个节点每一步的方向 1805
1740. 找到二叉树中的距离(会员题)
1644. 二叉树的最近公共祖先 II(会员题)
1650. 二叉树的最近公共祖先 III(会员题)
1676. 二叉树的最近公共祖先 IV(会员题)
§2.9 二叉搜索树
视频讲解【基础算法精讲 11】

98. 验证二叉搜索树 有前序、中序和后序三种做法
230. 二叉搜索树中第 K 小的元素
501. 二叉搜索树中的众数
99. 恢复二叉搜索树
700. 二叉搜索树中的搜索
530. 二叉搜索树的最小绝对差 1303
783. 二叉搜索树节点最小距离 同 530 题
1305. 两棵二叉搜索树中的所有元素
938. 二叉搜索树的范围和 1335
897. 递增顺序搜索树 1473
2476. 二叉搜索树最近节点查询 1597
653. 两数之和 IV - 输入二叉搜索树
1373. 二叉搜索子树的最大键值和 1914
1932. 合并多棵二叉搜索树 2484
285. 二叉搜索树中的中序后继(会员题)
510. 二叉搜索树中的中序后继 II(会员题)
270. 最接近的二叉搜索树值(会员题)
272. 最接近的二叉搜索树值 II(会员题)
255. 验证二叉搜索树的前序遍历序列(会员题)
1902. 给定二叉搜索树的插入顺序求深度(会员题)
§2.10 创建二叉树
108. 将有序数组转换为二叉搜索树
654. 最大二叉树
998. 最大二叉树 II 1498
1008. 前序遍历构造二叉搜索树 1563
1382. 将二叉搜索树变平衡
2196. 根据描述创建二叉树 1644
105. 从前序与中序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树
889. 根据前序和后序遍历构造二叉树 1732
1028. 从先序遍历还原二叉树 1797
536. 从字符串生成二叉树(会员题)
1628. 设计带解析函数的表达式树(会员题)
1597. 根据中缀表达式构造二叉表达式树(会员题)
§2.11 插入/删除节点
701. 二叉搜索树中的插入操作
450. 删除二叉搜索树中的节点
669. 修剪二叉搜索树
776. 拆分二叉搜索树(会员题)
1666. 改变二叉树的根节点(会员题)
§2.12 树形 DP
337. 打家劫舍 III
968. 监控二叉树
LCP 10. 二叉树任务调度
LCP 34. 二叉树染色
LCP 64. 二叉树灯饰
2313. 二叉树中得到结果所需的最少翻转次数(会员题)
更多树形 DP,见 动态规划题单 中的「树形 DP」。

§2.13 BFS
视频讲解【基础算法精讲 13】

102. 二叉树的层序遍历
103. 二叉树的锯齿形层序遍历
107. 二叉树的层序遍历 II
199. 二叉树的右视图
513. 找树左下角的值
515. 在每个树行中找最大值
637. 二叉树的层平均值
1161. 最大层内元素和 1250
993. 二叉树的堂兄弟节点 1288
2583. 二叉树中的第 K 大层和 1374
1302. 层数最深叶子节点的和 1388
2415. 反转二叉树的奇数层 1431
1609. 奇偶树 1438
623. 在二叉树中增加一行
2471. 逐层排序二叉树所需的最少操作数目 1635
863. 二叉树中所有距离为 K 的结点 1663
2641. 二叉树的堂兄弟节点 II 1677
919. 完全二叉树插入器 1691
331. 验证二叉树的前序序列化
958. 二叉树的完全性检验 1703
662. 二叉树最大宽度
3157. 找到具有最小和的树的层数(会员题)
1602. 找到二叉树中最近的右侧节点(会员题)
742. 二叉树最近的叶节点(会员题)
1660. 纠正二叉树(会员题)
§2.14 链表+二叉树
114. 二叉树展开为链表
1367. 二叉树中的链表 1650
109. 有序链表转换二叉搜索树
116. 填充每个节点的下一个右侧节点指针 做到 O(1) 空间
117. 填充每个节点的下一个右侧节点指针 II 做到 O(1) 空间
426. 将二叉搜索树转化为排序的双向链表(会员题)
§2.15 N 叉树
589. N 叉树的前序遍历
590. N 叉树的后序遍历
559. N 叉树的最大深度
429. N 叉树的层序遍历
427. 建立四叉树
558. 四叉树交集
428. 序列化和反序列化 N 叉树(会员题)
1490. 克隆 N 叉树(会员题)
1506. 找到 N 叉树的根节点(会员题)
1522. N 叉树的直径(会员题)
1516. 移动 N 叉树的子树(会员题)
§2.16 其他
297. 二叉树的序列化与反序列化
449. 序列化和反序列化二叉搜索树
652. 寻找重复的子树
173. 二叉搜索树迭代器
1261. 在受污染的二叉树中查找元素 1440
1104. 二叉树寻路 1545
987. 二叉树的垂序遍历 1676
655. 输出二叉树
979. 在二叉树中分配硬币 1709 贡献法
222. 完全二叉树的节点个数 做到低于 O(n) 时间
2049. 统计最高分的节点数目 1912
2673. 使二叉树所有路径值相等的最小代价 1917
2509. 查询树中环的长度 1948
2458. 移除子树后的二叉树高度 2299 推荐
LCP 26. 导航装置
LCP 52. 二叉搜索树染色
LCP 60. 力扣泡泡龙
314. 二叉树的垂直遍历(会员题)
666. 路径总和 IV(会员题)
1586. 二叉搜索树迭代器 II(会员题)
2773. 特殊二叉树的高度(会员题)
1485. 克隆含随机指针的二叉树(会员题)
2445. 值为 1 的节点数(会员题)
431. 将 N 叉树编码为二叉树(会员题)
2005. 斐波那契树的移除子树游戏(会员题)
三、一般树
§3.1 遍历
2368. 受限条件下可到达节点的数目 1477
582. 杀掉进程(会员题)
§3.2 自顶向下 DFS
1376. 通知所有员工所需的时间 1561
1443. 收集树上所有苹果的最少时间 1683
1377. T 秒后青蛙的位置 1824
3067. 在带权树网络中统计可连接服务器对数目 1909
2467. 树上最大得分和路径 2053
1766. 互质树 2232
2791. 树中可以形成回文的路径数 2677
§3.3 自底向上 DFS
3249. 统计好节点的数目 ~1600
1519. 子树中标签相同的节点数 1809
2872. 可以被 K 整除连通块的最大数目 1968
2477. 到达首都的最少油耗 2012
2973. 树中每个节点放置的金币数目 2277
2440. 创建价值相同的连通块 2460
1273. 删除树节点(会员题)
3004. 相同颜色的最大子树(会员题)
§3.4 直径
视频讲解【基础算法精讲 23】

2246. 相邻字符不同的最长路径 2126
3203. 合并两棵树后的最小直径 ~2150
1617. 统计子树中城市之间最大距离 2309
2538. 最大价值和与最小价值和的差值 2398
1245. 树的直径(会员题)
§3.5 DFS 时间戳
2322. 从树中删除边的最小分数 2392
§3.6 拓扑排序
310. 最小高度树
2603. 收集树中金币 2712
§3.7 最近公共祖先(LCA)
讲解
1483. 树节点的第 K 个祖先 2115 模板题
2846. 边权重均等查询 2508
2277. 树中最接近路径的节点(会员题)
§3.8 其他
2003. 每棵子树内缺失的最小基因值 2415
2867. 统计树中的合法路径数目 2428
2421. 好路径的数目 2445
1719. 重构一棵树的方案数 3018
2479. 两个不重叠子树的最大异或值(会员题)
另见 动态规划题单 中的「树形 DP」。

标签:二叉,链表,会员,二叉树,搜索,节点,指针
From: https://www.cnblogs.com/itdef/p/18388465

相关文章

  • 代码随想录算法day3 - 链表1
    题目1203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],v......
  • 数据结构-单链表-详解-1
    数据结构-单链表-详解-11.前言2.结点3.打印3.1关于断言3.2下一结点的找法物理结构逻辑结构1.前言在数据结构-顺序表-详解中,我详细介绍了顺序表的实现,而顺序表也有一些缺点:中间,头部插入时,需整体挪动数据,效率低下。空间不够时扩容,有一定的消耗,也可能有一定空间浪费......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • 【408DS算法题】029基础-二叉树的层次遍历
    Index题目本文稍后补全,以下内容来自:https://blog.csdn.net/weixin_60702024/article/details/141615340分析实现总结题目本文稍后补全,以下内容来自:https://blog.csdn.net/weixin_60702024/article/details/141615340给定二叉树的根节点root,写出函数实现对二叉树的层......
  • 数据结构:双向链表
    目录结构体创建链表插入链表头插法尾插法 遍历打印删除更新查找销毁结构体typedefintDataType;typedefstructnode{structnode*pPre;DataTypedata;structnode*pNext;}LinkNode;创建链表LinkNode*CreateDouList(){LinkNode......
  • 算法: 双指针
    题目:环形链表题目讲解:判断环要判断链表是否有环,可以使用快慢指针的方法。快指针每次走两步,慢指针每次走一步。如果链表有环,快慢指针最终会相遇;如果没有环,快指针会先到达链表末尾。为什么快指针走两步,慢指针走一步?因为这样快指针会更快进入环,并在环中追上慢指针。具体来说,......
  • 智能指针
    智能指针在C++中管理动态内存可以使用new和delete,但通过这种方式得到的指针(裸指针)是容易忘记释放的进而导致内存泄漏。因此C++标准中提供了智能指针shared_ptr,weak_ptr和unique_ptr来进行动态内存的管理。智能指针的设计满足了RAII(ResourceAcquisitionIsInitialization)的特......
  • ★♛★指针(重难点)合集
    1.介绍地址内存:所有程序的运行在内存中用CheatEngine查看任意程序的内存(16进制):显示大量的数据想要定位某个数字,需要知道地址(类比二维坐标)如F8的地址为00BCB900+08(偏移量),所以是00BCB908(偏移)ctrl+G则有内存单元的说明:打开计算器点三道杠,选程序员显然一......
  • 力扣: 环形链表
    文章目录需求MapSet快慢指针结尾需求给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。......
  • C语言涉及问题(文件IO与数组和指针)
    一、文件IO相关1、标准出错、输入、输出三者的缓冲机制是什么?标准出错(stderr):属于不缓冲机制,数据直接写入设备标准输入(stdin)和标准输出(stdout):属于行缓冲和全缓冲,行缓冲时需要用'\n'分隔,全缓冲是缓冲区满才会写入或者输出。冲刷缓冲函数:fflush();无论是如果想将全缓冲......