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

LeetCode 530. 二叉搜索树的最小绝对差
题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)代码随想录算法训练营第二十天|530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先_第1张图片

​思路:

一开始我以为两个点要有父子关系,也就是相连,所以做错了。正确的做法是初始化一个res来存最小的差值,然后递归来计算。

代码:

#python  写错了的版本
# 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 getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        def helper(node):
            if node.left:
                self.res = min(self.res, node.val - node.left.val)
                helper(node.left)
            if node.right:
                self.res = min(self.res, node.right.val - node.val)
                helper(node.right)
        helper(root)
        return self.res

    def __init__(self):
        self.res = float('inf')
#python 正确版本  我们注意一直比对一个最小的self.res就好
# 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 getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.traversal(root)
        return self.res

    def __init__(self):
        self.res = float('inf')
        self.pre = None
    
    def traversal(self, cur):
        if not cur:
            return
        self.traversal(cur.left)
        if self.pre:
            self.res = min(self.res, cur.val - self.pre.val)
        self.pre = cur
        self.traversal(cur.right)

LeetCode 501. 二叉搜索树中的众数
题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode)代码随想录算法训练营第二十天|530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先_第2张图片

​思路:

朴素的想法:使用一个hashmap来存出现的元素及其频次,然后对hashmap进行排序,取一个最大的输入res中,遍历一下hashmap,如果有频次与第一个相同的,则也是满足结果要求的众数,我们也要把其键值也就是该数放入res中。

代码:

#python  
# 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 findMode(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        def helper(node):
            if not node:
                return
            self.hashmap[node.val] = self.hashmap.get(node.val, 0) + 1
            helper(node.left)
            helper(node.right)

        helper(root)
        sorted_hashmap = sorted(self.hashmap.items(), key=lambda x: x[1], reverse=True)
        max_count = sorted_hashmap[0][1]
        res = []
        for key, count in sorted_hashmap:
            if count == max_count:
                res.append(key)
            else:
                break
        return res

    def __init__(self):
        self.res = []
        self.hashmap = {}

LeetCode 236.  二叉树的最近公共祖先
题目链接:236. 二叉树的最近公共祖先 - 力扣(LeetCode)代码随想录算法训练营第二十天|530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先_第3张图片

​思路:

递归再递归。

代码:

#python
class Solution:
    def lowestCommonAncestor(self, root, p, q):
        if root == q or root == p or root is None:
            return root

        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)

        if left is not None and right is not None:
            return root

        if left is None and right is not None:
            return right
        elif left is not None and right is None:
            return left
        else: 
            return None

你可能感兴趣的:(算法,数据结构)