代码随想录学习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
相关推荐
我命由我123451 小时前
Photoshop - Photoshop 矢量蒙版
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·photoshop
熊猫钓鱼>_>2 小时前
越顺,越空:当 AI 把学习 “优化“ 到消失
人工智能·学习·ai·llm·agent·ai编程·metaai
一条破秋裤2 小时前
02_注册设备号_从主次设备号到成对注销
学习
@codercjw3 小时前
企业实战电机和传感器选型
学习
zhangrelay4 小时前
用ROS2Lyrical实验报告册思路重做蓝桥云课ROS1实验并改进
linux·笔记·学习·ubuntu·机器人
m4Rk_4 小时前
【论文阅读】Agent 记忆机制(91):THEANINE——不删除过时记忆,让 Agent 记住事情是如何变化的
论文阅读·人工智能·学习·开源·github
我命由我123454 小时前
Photoshop - Photoshop 面板和菜单
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·photoshop
一木 之林5 小时前
RAG开发学习总结:从 LangChain 入门到检索增强生成链路的全栈实战-4/6
人工智能·学习·计算机视觉·langchain
LHR_friendship5 小时前
HCIP课程全部内容
网络·笔记·学习·hcip·华为ensp
海绵宝宝转agent5 小时前
Pico 学习笔记 Harness 设计、历史压缩、三类目录与缓存复用
笔记·学习·缓存