代码随想录学习Day 18

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

题目链接

讲解链接

思路:利用二叉搜索树的性质,其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历,得到一个递增的数组后,再遍历整个数组,依次求相邻值的差,最后返回最小的差值即可。

python 复制代码
class Solution:
    def __init__(self):
        self.vec = []
    def traversal(self, root):  # 递归中序遍历
        if not root:
            return
        self.traversal(root.left)
        self.vec.append(root.val)
        self.traversal(root.right)
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        sub = []  # 保存所有差值的数组
        self.traversal(root)
        for i in range(1, len(self.vec)):
            sub.append(abs(self.vec[i] - self.vec[i - 1]))
        return min(sub)  # 返回数组中的最小值
            

采用双指针法可以省去开辟数组的过程,需要用一个pre节点记录一下cur节点的前一个节点。

python 复制代码
class Solution:
    def __init__(self):
        self.result = float('inf')  # 初始化一个最大值
        self.pre = None

    def traversal(self, cur):
        if cur is None:
            return
        self.traversal(cur.left)  # 左
        if self.pre is not None:  # 中
            self.result = min(self.result, cur.val - self.pre.val)  # 第一个节点不进行比较
        self.pre = cur  # 让pre指向cur
        self.traversal(cur.right)  # 右

    def getMinimumDifference(self, root):
        self.traversal(root)
        return self.result

501.二叉搜索树中的众数

题目链接

讲解链接

首先想到的是用一个字典来保存树中所有的值及其出现的次数,实现map映射。将出现次数最多的元素统计出来并保存到列表中。

python 复制代码
class Solution:
    def __init__(self):
        self.dic = dict()  # 创建字典
    def traversal(self, root):  # 递归遍历
        if not root:
            return None
        self.traversal(root.left)
        if root:
            self.dic[root.val] = self.dic.get(root.val, 0) + 1  # 记录树中所有元素及出现的次数
        self.traversal(root.right)
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        result= []  # 定义列表保存结果
        self.traversal(root)  # 遍历树
        max_val = max(self.dic.values())  # 求字典中最大值
        for key, value in self.dic.items():  # 找到字典中最大值所对应的所有key,即为出现频次最高的元素
            if value == max_val:
                result.append(key)  # 将结果添加至列表中
        return result

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

题目链接

讲解链接

求最小公共祖先,需要从底向上遍历,那么只能通过后序遍历(即回溯)实现从底向上的遍历。

重点:节点本身也可以算作是公共祖先。

递归三部曲:

1.递归函数参数及返回值:参数为根节点和要查找的p,q节点,返回值为TreeNode。

python 复制代码
def lowestCommonAncestor(self, root, p, q)

2.递归终止条件:遇到空则返回空;找到root == q,或者root == p,说明找到 q p ,则将其返回 。

python 复制代码
if root == p or root == q or not root:
    return root

3.单层递归逻辑:本题需要遍历整棵树,先用left和right接住左子树和右子树的返回值。如果left 和 right都不为空,说明此时root就是最近公共节点。如果left为空,right不为空,就返回right,说明目标节点是通过right返回的

python 复制代码
left = self.lowestCommonAncestor(root.left, p, q)
right = self.owestCommonAncestor(root.right, p, q)
if not left and right:
    return right
elif left and not right:
    return left
else:
    return None

整体的查找流程如图:

完整代码如下:

python 复制代码
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root == q or root == p or not root:  # p或q本身为公共祖先也考虑到了
            return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if left and right:
            return root
        if not left and right:
            return right
        elif left and not right:
            return left
        else: 
            return None
相关推荐
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
毛小茛7 天前
计算机系统概论——校验码
学习
babe小鑫7 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms8 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下8 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。8 天前
2026.2.25监控学习
学习
im_AMBER8 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J8 天前
从“Hello World“ 开始 C++
c语言·c++·学习