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

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

讲解 - 🔗
💡跟昨天的用双指针法来中序遍历二叉树一样。刚开始不是特别能理解,用编译器自己跑一遍就好了。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def __init__(self):
        self.min_diff = float('inf')
        self.pre = None
    
    def traversal(self, root):
        if not root:
            return
        
        left = self.traversal(root.left) # 左
        if self.pre: # 中
            self.min_diff = min(abs(self.pre.val - root.val), self.min_diff)
        self.pre = root
        right = self.traversal(root.right) # 右

    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        # 因为是二叉搜索树,所以按照中序遍历得到的节点值依次变大,所以只需要用双指针按顺序遍历二叉树即可
        self.traversal(root)
        return self.min_diff

501.二叉搜索树中的众数 - 🔗

讲解 - 🔗
💡比较重要的操作是单层递归里面判断是否是众数。用一个数组res去记录结果。当某一个数字遍历完成,与self.max_times比较,如果比self.max_times大,则用该数字的出现频率self.times去更新self.max_times,并将res清空,然后将数字值append到res中;如果相等,则无需更新self.max_times和清空res,但仍需要在res后append数字值。
需要注意的是,在遍历结束后,最后一组数字值没有被比较过,需要额外比较。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def __init__(self):
        self.res = []
        self.pre = None
        self.max_times = 0
        self.times = 1
    def traversal(self, cur):
        if not cur:
            return
        left = self.traversal(cur.left)
        if self.pre:
            # cur 与 pre 节点值相等
            if self.pre.val == cur.val:
                self.times += 1
                # 判断是否为众数
            elif self.times > self.max_times:
                self.res.clear()
                self.res.append(self.pre.val)
                self.max_times = self.times # 更新max_times值
                self.times = 1
            elif self.times == self.max_times:
                self.res.append(self.pre.val)
                self.times = 1
            else:
                self.times = 1


        self.pre = cur
        right  = self.traversal(cur.right)

    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        # 根据BST的定义,当pre和cur的节点值不一致时,说明cur已经移到了下一个数,则上一个数的频率可以进行结算
        self.traversal(root)
        if self.times > self.max_times:
            self.res.clear()
            self.res.append(self.pre.val)
            self.max_times = self.times # 更新max_times值
        elif self.times == self.max_times:
            self.res.append(self.pre.val)

        return self.res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值