代码随想录算法训练营第18天

92 阅读2分钟

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.path=[]
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.traverse(root)
        n=len(self.path)
        for i in range(1,n):
            if abs(self.path[i-1]-self.path[i])<self.min_diff:
                self.min_diff=abs(self.path[i-1]-self.path[i])
        return self.min_diff

    def traverse(self,root):
        if root is None:
            return 
        self.traverse(root.left)
        self.path.append(root.val)
        self.traverse(root.right)

501.二叉搜索树中的众数

总结一下这道题我所学到的字典知识:

  1. 根据字典value的大小进行排序
sorted_dict=dict(sorted(my_dict.items(),key=lamda item:item[1]))  #item[0]指的是键,item[1]指的是值
  1. 寻找字典中最大值对应的键
key_with_max_value=max(my_dict,key=my_dict.get)  #只找最大值中的第一个
keys_with_max_value=[key for key,value in my_dict.items() if value==max_value)  #找到最大值的所有键
# 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.cnt={}
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.traverse(root)
        max_num_value=max(self.cnt.values())
        keys=[key for key,value in self.cnt.items() if value==max_num_value]
        return keys
    def traverse(self,root):
        if root is None:
            return 
        self.traverse(root.left)
        self.cnt[root.val]=self.cnt.get(root.val,0)+1
        self.traverse(root.right)

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

这道题有两种情况:

  1. 两个节点其中之一就是最近公共祖先:直接返回根节点
  2. 两个节点都在最近公共祖先节点的子树里面,那么就遍历查找,在后序判断左右节点是否非空
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        return self.find(root, p.val, q.val)

    # 在二叉树中寻找 val1 和 val2 的最近公共祖先节点
    def find(self, root: 'TreeNode', val1: int, val2: int) -> 'TreeNode':
        if root is None:
            return None
        # 前序位置
        if root.val == val1 or root.val == val2:
            # 如果遇到目标值,直接返回
            return root
        left = self.find(root.left, val1, val2)
        right = self.find(root.right, val1, val2)
        # 后序位置,已经知道左右子树是否存在目标值
        if left is not None and right is not None:
            # 当前节点是 LCA 节点
            return root
        
        return left if left is not None else right