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

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

题目

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

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值

差值是一个正数,其数值等于两值之差的绝对值。

# 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 = float('inf')
        self.pre = None
    def preOrder(self, root):
        if not root:return
        self.preOrder(root.left)
        if self.pre:
            self.res = min(self.res, root.val - self.pre.val)
        self.pre = root
        self.preOrder(root.right)
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.preOrder(root)
        return self.res

题目

501.二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树
# 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 preOrder(self, root, dic):
        if not root:return
        dic[root.val] += 1
        self.preOrder(root.left, dic)
        self.preOrder(root.right, dic)
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        dic = defaultdict(int)
        if not root:return res
        self.preOrder(root, dic)
        dic_value = max(dic.values())
        for key, value in dic.items():
            if dic_value == value:
                res.append(key)
        return res

题目

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

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:return None
        # 找到了
        if root == q:return root
        if root == p:return root
        left_node = self.lowestCommonAncestor(root.left, p, q)
        right_node = self.lowestCommonAncestor(root.right, p, q)
        if left_node and right_node:return root
        if left_node and not right_node:return left_node
        if not left_node and right_node:return right_node
        return None

你可能感兴趣的:(代码随想录,算法)