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

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

找到2个相邻的数之间的差值,就必定要遍历整颗树,利用BST的特性,采用中序遍历(这样就会使递增排列)+双指针(省了一个存放转换数组的空间) , 每一次向后遍历都去更新pre 和res(如果出现更小插值的话)。

自己容易犯错的地方就是递归是否可以在给定的原函数内,或者需要另外一个helper function 帮助自己。
答: 在确定递归的返回值时,确定是否需要的返回和输入和给的函数签名相符,不相符就另外再用一个函数。

501.二叉搜索树中的众数

  1. 最直白的方法就是,遍历数,同时生成一个Hashmap来记录出现的频率信息。因为题目要求把所有的最大频率数返回,所以需要遍历2遍HASHMAP, 第一遍是为了找最大值,第二遍根据最大值找答案。
  2. 升级版本:因为BST的特殊性质,如果以中序遍历,一定是递增的数列,这样用2个指针顺序遍历,相同的肯定会排在一起,我们就可以顺序遍历时相同的加在一起,找到最高频率的值。
    至于如何去存储信息,这里卡哥用了一个很好的方法:直接用2个变量就可以: maxCount(当前出现的最大频率) curCount(当前数出现的频率) 不用存储值是因为这个值会直接存储在需要返回的res List中。具体实现如下:
    当遍历到新的节点时,先去判定curCount的值到底该+1 还是置0 呢? 如果是一个新的值node,那curCount 就直接变成1,因为curCount的意义是去数当前节点的值出现的数量,(前面的点所出现的频率一旦大于历史记录的maxCount,就会被记录下来,小于的话就会被丢弃)
    更新好了maxCount之后,下一步就是要去更新res List,如果 curCount > macCount ,说明出来了新的候选人,那就更新maxCount,同时把之前存储的结果list 清空,加入这个新的res; 如果 curCount == macCount 说明新加入的值的出现频率等于现在最高频率,那就需要把遍历的当前值放到结果List中;如果小于就不管这个点,因为他还没有达到当前最大频率,直接进入下一次迭代。

LCA 公共祖先问题

236. 二叉树的最近公共祖先
首先,如果没有代码的情况下,我们应该如何实现?
从根节点开始向下开始递归进行后序遍历(因为我们需要拿到左子树,右子树再将信息传递到根节点)当我们找到我们需要的2个点的时候,就开始向上回溯传递信息,传到根节点返回。

伪代码的实现:
递归三部曲:
判定截止条件,如果null, root==q, root ==q 说明找到了,或者压根数就没有,直接返回
先遍历左子树,在遍历右子树,拿到这两个遍历得结果(这里说明了递归是需要返回值的)
拿到结果之后判定:
如果2边有一个是非空,就把非空的节点向上传递
如果都是非空,那说明就找到了结果,
不可能出现都是空的结果,因为题目要求P或者Q一定会出现在树中,所以必定最后有一个会返回值回来。

235. 二叉搜索树的最近公共祖先
因为BST的特殊性质,我们不需要回溯传递信息,直接从上向下递归:如果当前结点值大于p和q 的值,说明我们要继续往小的方向寻找。
反之我们需要向右寻找。因为最后找到的root一定是值大于q 或者小于p,那个时候也就是可以直接返回root的时候。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值