代码随想录刷题营Day21(530:二叉搜索树的最小绝对差,501:二叉搜索树中的众数,236:二叉树的最近公共祖先)

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

第一种解法:
先递归(中序遍历)再拿到中序数组之后,再用for循环进行遍历。这个方法还是很简单的。
第二种解法:
双指针法,定义一个pre和一个cur。
用cur遍历,pre紧跟其后。如何能够实现,一前一后的指针,就看中序那里是怎么写的:
cur=pre即可。

class Solution:
    def getMinimumDifference(self,root):
        pre=TreeNode(None)
        self.result=float("inf")
        def Traversal(cur):
            # global result
            if cur==None:
                return
            Traversal(cur.left)
            nonlocal pre
            if pre.val!=None:
                cc=cur.val
                pp=pre.val
                diff=abs(cur.val-pre.val)
                if diff <self.result:
                    self.result=diff
            pre=cur
            Traversal(cur.right)
        Traversal(root)
        return self.result

501:二叉搜索树中的众数

因为操作的是二叉搜索树,所以要用中序递归遍历,才能够凸显二叉搜索树的性质!从这个题目中,学会使用def init()定义变量的用法,不然后面调用变量的时候会报错的。这个题遍历一遍就可以,主要就是利用了而二叉搜索树的性质。使用双指针实现,只要cur.val!=pre.val了,那就是那就比较现阶段的count有没有超过记录的max,如果没有超过,继续将count归为1,进行下一个元素的遍历。这个题还是需要多刷即便的。
今天还学会了一个写法,那就是 self.result=[cur.val],通过这样写,就能起到覆盖之前的self.result中的元素的效果。

class Solution:
    def __init__(self):
        self.max_res=0
        self.conut=0
        self.result=[]
        self.pre=TreeNode()
    def Traversal(self,cur):
        if not cur:
            return None
        self.Traversal(cur.left)
        if not self.pre:
            self.conut=1
        elif self.pre.val==cur.val:
            self.conut=self.conut+1
        else:
            self.conut=1
        self.pre=cur
        if self.conut==self.max_res:
            self.result.append(cur.val)
        if self.conut>self.max_res:
            self.max_res=self.conut
            self.result=[cur.val]
        self.Traversal(cur.right)
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return None
        self.Traversal(root)
        return self.result

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

明天补上!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值