代码随想录算法训练营第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)
有序性题目
中序 利用中序遍历的有序性特征
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×