Day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

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

需要领悟一下二叉树遍历上双指针操作,优先掌握递归
题目链接/文章讲解:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html
视频讲解:https://www.bilibili.com/video/BV1DD4y11779

思考

中序遍历的同时,用pre记录一下上一个节点。

class Solution:
    def __init__(self):
        self.min_num = float('inf')
        self.pre = None
    def traversal(self,root):
        if root is None:
            return
        self.traversal(root.left)
        if self.pre:
            self.min_num = min(self.min_num,root.val - self.pre.val)
        self.pre = root
        self.traversal(root.right)

    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.traversal(root)
        return self.min_num

501.二叉搜索树中的众数

和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。

可以先自己做做看,然后看我的视频讲解。

https://programmercarl.com/0501.二叉搜索树中的众数.html
视频讲解:https://www.bilibili.com/video/BV1fD4y117gp

# 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.max_freq = 0
        self.count = 0
        self.pre = None
    def traversal(self,root):
        if root is None:
            return 
        self.traversal(root.left)
        if self.pre:
            if root.val == self.pre.val:
                self.count+=1
            else:
                self.count = 1
            if self.count>self.max_freq:
                self.res.clear()
                self.max_freq = self.count
                self.res.append(root.val)
            elif self.count == self.max_freq:
                self.res.append(root.val)
            #print(self.res)
        else:
            self.count=1
            self.max_freq = self.count
            self.res.append(root.val)
        self.pre = root
        self.traversal(root.right)
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.traversal(root)
        return self.res

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

本题其实是比较难的,可以先看我的视频讲解

https://programmercarl.com/0236.二叉树的最近公共祖先.html
视频讲解:https://www.bilibili.com/video/BV1jd4y1B7E2

思考

这道题确实有一些难度。通过后序遍历递归返回最近公共祖先。

# 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 root == p or root == q or root is None:
            return root
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        if left is None and right:
            return right
        elif left and right is None:
            return left
        elif left and right:
            return root
        else:
            return None
posted @ 2024-06-15 13:03  forrestr  阅读(21)  评论(0)    收藏  举报