算法训练营day20 | {530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数, 236.二叉树的最近公共祖先}
第六章二叉树part06,二叉搜索树经过中序遍历之后是一个有序的递增序列,要利用好这一点。
530. 二叉搜索树的最小绝对差
- 题目链接:530.二叉搜索树的最小绝对差
- 文档讲解:代码随想录–530.二叉搜索树的最小绝对差
- 视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差
- 状态:即便提示了双指针,在利用二叉搜索树的有序递增特性上还是不熟练。
1.1 解题分析
- 本题是一个二叉搜索树,遇到在BST上求最值、差值之类的问题,把它想成一个有序数组上求最值、求差值,这样就简单多了。
▶
530. 二叉搜索树的最小绝对差1 | |
501. 二叉搜索树中的众数
- 题目链接:501.二叉搜索树中的众数
- 文档讲解:代码随想录–501.二叉搜索树中的众数
- 视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数
- 状态:普通二叉树遍历一遍用map保存;二叉搜索树用中序遍历解决也简单的。
2.1 解题分析
分析递归三步曲:
- 参数和返回值是什么? 要传入一个根节点,全局变量需要定义一个count记录出现次数,初始为0,一个最大出现次数maxCount,一个pre指针记录开始计数的位置;不需要返回值。
- 确定递归的终止条件。 如果当前遍历到空节点了,就返回。
- 确定单层递归的逻辑。 中序遍历,左中右,保证是一个非递减的遍历,注意当maxCount迎来更新时,要把目前暂存的“众数”结果全部弹出,再进行存入。
注意这边就用到了昨天总结的关于递归函数什么时候需要定义全局变量?什么时候不需要?
- 当需要左右子树共享信息时,需要定义全局变量;
- 当每次递归是一个个独立的子问题时,不需要全局变量。
再次强调形参的语义:形参=父问题给子问题的约束。
▶
530. 二叉搜索树的最小绝对差1 | |
236. 二叉树的最近公共祖先
- 题目链接:236. 二叉树的最近公共祖先
- 文档讲解:代码随想录–236. 二叉树的最近公共祖先
- 视频讲解:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先
- 状态:一看就适合用后序遍历的方式解决。
3.1 解题分析
审题,本题的二叉树中,所有节点的值均不相同,所以节点p或q的值不可能在树中出现两次。
分析递归三步曲:
- 参数和返回值是什么? 要传入一个根节点,指定的节点p、节点q;返回值是TreeNode
- 确定递归的终止条件。 如果当前遍历到空节点,则返回null;如果当前遍历到q节点或p节点,则直接返回该节点。
- 确定单层递归的逻辑。 后序遍历,左右中,情况1,如果左子树和右子树返回的结果均不为空,那么当前节点就是最近的公共祖先;情况2,如果左子树或右子树其中一个为空,另一个不为空,继续向上返回不为空的结果,此种情况最好结合画图理解。

▶
530. 二叉搜索树的最小绝对差1 | |
5. 今日收获
- 对于一个二叉搜索树,第一时间要想到它中序遍历之后是一个递增的有序序列的特性。接着将求最值、求差值问题,自然地转化为一个有序数组中求最值/差值的问题。
- 继续巩固了关于递归函数什么时候需要定义全局变量?什么时候不需要的问题,能够掌握了。
- 学习时长:2.5小时
算法训练营day20 | {530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数, 236.二叉树的最近公共祖先}
http://paopaotangzu.xyz/cn/day20_leetcode/