代码随想录算法训练营第十七天|530.二叉搜索树的最小绝对差 | 501.二叉搜索树中的众数 |236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差

文档讲解:代码随想录

视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili

1. 第一遍没有看懂题, 用层序遍历将所有树节点保存到一个数组中,然后依次遍历数组中每一个元素(即节点),将节点值作为基准元素递归遍历以这个节点为根节点的二叉树,计算根节点和当前遍历节点的值差的绝对值,然后和全局最小值进行比较,如果比全局最小值更小则更新全局最小值,最后返回全局最小值。

2. 此题中说了是找二叉搜索树的最小绝对差,这颗树是有顺序的,左子树的值小于根节点的值小于右子树的值,用中序遍历转为转为数组也可以比较简单计算出最小绝对差,更好的方法是用一个指针变量记录前一个遍历节点的值(这里利用了二叉搜索树是有序的这个性质,最小绝对差的两个元素一定是相邻的两个元素),通过不断地递归中序遍历整棵树,同时更新pre指针变量,依次计算差的绝对值,然后和全局最小绝对差进行比较,如果当前差的绝对值更小则更新全局最小绝对差,最后返回全局最小绝对差。

3. 不知道如何用javascript表示一个最大的数,忘记了是将当前遍历节点值和前一个结点值做差再和全局最小值做比较,这里用了当前遍历结点值直接和全局最小值做了比较,不够细致。忘记了更新pre指针,有偷懒的想法,因为看卡哥视频讲解中将一些关键代码都记录下来了,没有严格要求自己。

4. javascript中Math.max()对应的是-Infinity,要细致地读题,充分利用题目中的条件;刷题时尽量不要偷懒背题不思考;用了一天的零散时间。

501.二叉搜索树中的众数

文档讲解:代码随想录

视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数_哔哩哔哩_bilibili

1.  通过中序遍历将二叉搜索树所有结点值转为一个数组,然后本题就变成了求一个数组最长的连续重复子数组对应的数值的问题,然后用快慢指针先找到最大重复次数,然后同样用快慢指针再循环一遍数组找到所有等于最大重复次数的数值将其保存到一个结果数组中返回。

2. 用双指针的思路,定义一个指针记录前一个遍历的结点,再定义一个全局最大重复次数的最大值,再定义一个全局变量result收集结果集,中序遍历过程中,定义一个count记录当前重复了多少次,如果当前重复次数和全局最大重复次数相等,则收集结果集,如果当前重复次数大于全局最大重复次数,更新全局最大重复次数的同时还要清空结果集,因为之前的结果集已经不满足条件了,最后返回结果集。

3. 在用1中的思路时,当得到二叉搜索树中序遍历结点值数组后,用快慢指针遍历时在边界条件那里想了很长时间。在用2中的思路时更新前一个pre指针写到了判断当前结点和前一个结点的判断逻辑中去了,中序遍历过程中用于记录当前重复次数的count大于全局最大重复次数的代码处理逻辑中,只更新了全局最大重复次数和清空了结果数组,没有将新的结点值添加到结果数组中。

4. 在用1中的思路中,当得到二叉搜索树中序遍历结点值数组后,用快慢指针遍历时在边界条件外层写一个条件后可以通过内层循环逻辑去适配这个边界条件,不用同时外层考虑两个边界条件,这样可能会思路会乱。在用2中的思路时更新前一个pre指针写到了判断当前结点和前一个结点的判断逻辑中去了,中序遍历过程中用于记录当前重复次数的count大于全局最大重复次数的代码处理逻辑中,如果中序遍历过程中当前重复次数大于全局最大重复次数了,说明此时找到了更满足题条件的解,应当清空数组但也需要将当前结点值保存下来,否则结果集就会漏解。用了两天的零散时间。

236. 二叉树的最近公共祖先

文档讲解:代码随想录

视频讲解:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibili

1. 读题后感觉需要题目说的是判断两个结点是否有共同的最近祖先,不知道咋做。

2. 本题用了回溯的思想,首先需要明确是从下往上找,所以用后续遍历,在左右子树上如果找到了这两个子节点中的其中一个都可以返回到上一级递归中,上一级递归中判断左右子树是否分别有这两个结点,如果有,那说明这一级递归中的结点就是最近的公共祖先,如果只有左子树有其中一个给定子节点,右子树没有给定的另一个子节点,说明当前递归层中的结点不是公共祖先,那么则返回右的这个子节点,交由上一级递归中的结点去判断,反之如果右子树有左子树没有也是同样的逻辑,如果左右子树都没有,那么就返回null。递归的终止条件是如果当前遍历结点为null或者为两个给定子节点中的其中一个则返回当前结点。

3. 分别递归左右子树的时候递归函数中少写了参数,又有背卡哥视频的代码,对原理理解的还不是很透彻。

4. 尽量理解原理做题而不是靠记忆。用了两天的零散时间

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值