代码随想录算法训练营第21天|二叉树Part08
二叉树总结篇。
遍历方式总结
深度优先遍历(DFS)
- 递归方式:前序(中左右)、中序(左中右)、后序(左右中)
- 迭代方式:使用栈模拟递归,适用于三种顺序
广度优先遍历(BFS)
- 使用队列进行层序遍历
- 可拓展为“每层最大值”“之字形遍历”“最后一层左/右值”等题型
二叉树基本属性问题
| 题目 | 解法思路 | 遍历顺序 | 
|---|---|---|
| 0101. 对称二叉树 | 递归比对左右子树是否对称; 队列模拟同步遍历 | 后序(递归) / 层序 | 
| 0104. 二叉树的最大深度 | 返回左右子树最大高度 + 1 | 后序 / 层序 | 
| 0111. 二叉树的最小深度 | 注意忽略不存在的子树 | 后序 / 层序 | 
| 0222. 完全二叉树的节点个数 | 后序递归, 或利用完全树高度差剪枝 | 后序 | 
| 0110. 平衡二叉树 | 返回高度同时判断是否失衡 | 后序 | 
| 0513. 找树左下角的值 | 层序遍历记录每层第一个节点; 或 DFS 记录最深层左值 | 层序 or DFS | 
| 0404. 左叶子之和 | 判断左子节点是否是叶子并累加 | 后序 / 层序 | 
| 0112. 路径总和 | 路径累计判断等于目标值 | DFS + 回溯 / 栈辅助 | 
一般来说,求“树的整体属性”(如深度、是否平衡、节点数等)适合后序遍历,因为需要依赖子树返回值。
路径型问题(含回溯)
| 题目 | 解法思路 | 说明 | 
|---|---|---|
| 0257. 二叉树的所有路径 | 前序递归记录路径 + 回溯 | 构建路径字符串,回溯撤销路径 | 
| 0113. 路径总和 II | 前序递归 + 路径数组 + 回溯 | 找出所有路径和等于目标值的路径 | 
| 0437. 路径总和 III | DFS + 前缀和 + 回溯 | 路径不限起点,使用前缀和优化 | 
| 0129. 求根到叶子节点数字之和 | 前序递归记录数字路径 + 回溯 | 将路径数字转为整数求和 | 
| 0112. 路径总和 | 递归判断是否存在路径和 | 返回bool,判断是否存在目标路径 | 
虽然有些路径题目并未提及回溯,但本质就是回溯模式。 路径类问题处理策略通常是:前序遍历 + 路径回退。 此外有时候路径回退是可以隐藏在递归参数传递中的。
构造与修改问题
| 题目 | 解法思路 | 说明 | 
|---|---|---|
| 0226. 翻转二叉树 | 交换左右子树指针 | 前序 or 层序 | 
| 0106. 从中序与后序遍历构造二叉树 | 找到中间点递归构造左右子树 | 分治 + 前序构造思路 | 
| 0654. 最大二叉树 | 每次找当前数组最大值为根节点 | 分治递归 | 
| 0617. 合并二叉树 | 同步遍历两个树并合并节点 | 前序递归 / 层序队列 | 
构造树结构的题目,不论是否显式要求使用“前序遍历”,其核心总是:先构造当前节点,再构造左右子树。
最近公共祖先(LCA)
| 题目 | 解法思路 | 
|---|---|
| 0236. 二叉树的最近公共祖先 | 后序 + 回溯返回包含目标节点的子树 | 
| 0235. BST 的最近公共祖先 | 根据有序性判断节点在哪一侧 | 
二叉搜索树(BST)的性质问题
搜索 / 验证 / 转换类题目
| 题目 | 解法思路 | 
|---|---|
| 0700. 二叉搜索树中的搜索 | 利用有序性,向左/右递归查找 | 
| 0098. 验证二叉搜索树 | 中序遍历验证是否递增 | 
| 0530. 最小绝对差 | 中序 + 前驱节点保存 | 
| 0501. 二叉搜索树中的众数 | 中序统计频率,更新众数集合,适时清空结果集 | 
| 0538. 把 BST 转换为累加树 | 反中序遍历 + 累加和 | 
所有利用 BST 有序特性的问题(如最小差值、验证递增、累加转换)几乎都可通过中序遍历实现。 BST 中序遍历 = 有序数组。
BST 的修改与构造
| 题目 | 解法思路 | 
|---|---|
| 0701. 插入操作 | 按序插入位置,递归返回新子树 | 
| 0450. 删除操作 | 删除时分三种情况处理子节点 | 
| 0669. 修剪 BST | 递归返回修剪后的左右子树 | 
| 0108. 有序数组转 BST | 数组中点为根,递归构造 | 
遍历选择指南
| 问题类型 | 推荐遍历顺序 | 选择理由 | 
|---|---|---|
| 构造类 构造树结构 | 前序 | 当前节点必须先于子节点创建 | 
| 求属性 深度、平衡、节点数 | 后序 | 需等左右子树返回值才能得出结果 | 
| 路径类 路径总和、所有路径 | 前序 + 回溯 | 路径需在递归中积累,并在回溯中清除 | 
| 搜索树(BST) 有序性题目 | 中序 | 利用中序遍历的有序性特征 |