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

代码随想录刷题第二十一天

二叉搜索树的最小绝对差 (LC 530)

题目思路:

在这里插入图片描述

代码实现:

class Solution(object):
    def __init__(self):
        self.prev = None  # 将 prev 定义为类的成员变量
        self.result = float("inf")

    def getMinimumDifference(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        
        if root is None:
            return

        self.getMinimumDifference(root.left)
        if self.prev is not None:
            self.result = min(self.result, root.val-self.prev.val)
        
        self.prev = root
        
        self.getMinimumDifference(root.right)
        
        return self.result

二叉搜索树中的众数(LC 501)

题目思路:

在这里插入图片描述

代码实现:

  1. 中序遍历+双指针
class Solution(object):
    def __init__(self):
        self.result = []
        self.prev = None
        self.count = 0
        self.maxcount = 0

    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return
        self.findMode(root.left)

        if self.prev is None:  #第一个节点
            self.count = 1
        else:
            if root.val == self.prev.val:
                self.count+=1
            else:
                self.count=1
            
        if self.count>self.maxcount:
            del self.result[:]
            self.result.append(root.val)
            self.maxcount=self.count
        if self.count == self.maxcount:
            if self.result[-1] != root.val:
                self.result.append(root.val)

        self.prev = root
        print(self.result)
        self.findMode(root.right)
        return self.result
  1. 遍历所有节点,用字典保存每个值的频率,再两次遍历字典找到最大频率和对应的众数
class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        freq_map = defaultdict(int)  #key:元素,value:int
        self.searchTree(root, freq_map)
        maxfreq = 0
        res = []
        for value in freq_map.values():
            maxfreq = max(maxfreq, value)
        
        for key, value in freq_map.items():
            if value == maxfreq:
                res.append(key)
        return res


    def searchTree(self, node, freq_map):
        if node is None:
            return
        self.searchTree(node.left, freq_map)
        freq_map[node.val] +=1
        self.searchTree(node.right, freq_map)

二叉数最近的公共祖先 (LC 236)

题目思路:

在这里插入图片描述

代码实现:

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root is None:
            return None
        if root == p:
            return p
        if root == q:
            return q
        
        left = self.lowestCommonAncestor(root.left, p, q)   # 左
        right = self.lowestCommonAncestor(root.right, p, q) # 右

        # 中
        if left is None and right is None:
            return None
        elif left is not None and right is None:
            return left
        elif left is None and right is not None:
            return right
        else:
            return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值