当前位置: 首页 > article >正文

【LeetCode 刷题】二叉树-二叉搜索树的属性

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为二叉搜索树的属性相关的题目解析。

文章目录

  • 700.二叉搜索树中的搜索
  • 98.验证二叉搜索树
  • 530.二叉搜索树的最小绝对差
  • 501.二叉搜索树中的众数
  • 538.把二叉搜索树转换为累加树

700.二叉搜索树中的搜索

题目链接

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root or root.val == val:
            return root
        if root.val < val:
            return self.searchBST(root.right, val)
        else:
            return self.searchBST(root.left, val)
  • 二叉树上的二分查找

98.验证二叉搜索树

题目链接

class Solution:
    pre = -inf
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        left = self.isValidBST(root.left)
        if not left or root.val <= self.pre:
            return False
        self.pre = root.val
        return self.isValidBST(root.right)
  • 二叉搜索树的中序遍历结果是递增序列,因此在中序遍历过程中判断 pre.valcur.val 的大小关系
  • 上述写法中,由于只返回是否合法的布尔值,因此可以不用额外创建递归函数,将 pre 定义为类的成员变量
  • pre 初始化为负无穷,可以避免特判

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

题目链接

class Solution:
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        pre, res = -inf, inf

        def traversal(node: Optional[TreeNode]) -> None:
            if not node:
                return
            traversal(node.left)
            nonlocal pre, res
            res = min(res, node.val - pre)
            pre = node.val
            traversal(node.right)
        
        traversal(root)
        return res
  • 由于需要完整遍历整个二叉搜索树后,才可知最小绝对差,因此需要创建额外的递归函数,但函数返回值为空,仅用于遍历

501.二叉搜索树中的众数

题目链接

class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        pre, cur, cur_max, res = -inf, -inf, -inf, []

        def traversal(node: Optional[TreeNode]) -> None:
            if not node:
                return
            traversal(node.left)
            nonlocal pre, cur, cur_max, res
            # 更新 cur
            cur = cur + 1 if node.val == pre else 1
            # 更新 cur_max 和 res
            if cur > cur_max:
                cur_max = cur
                res = [node.val]
            elif cur == cur_max:
                res.append(node.val)
            # 更新 pre
            pre = node.val
            traversal(node.right)
        
        traversal(root)
        return res
  • 主要思路与上题类似,在中序遍历的同时统计特定的量
  • 需要注意此题的众数可能不止一个,需要同时返回,因此当频次相同时,都放入 res 列表中作为答案

538.把二叉搜索树转换为累加树

题目链接

class Solution:
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        pre_sum = 0

        def traversal(node: Optional[TreeNode]) -> None:
            if not node:
                return
            traversal(node.right)
            nonlocal pre_sum
            pre_sum += node.val
            node.val = pre_sum
            traversal(node.left)
        
        traversal(root)
        return root
  • 以"右、中、左"的顺序遍历,同时累加 pre_sum

http://www.kler.cn/a/528506.html

相关文章:

  • 2501,编写dll
  • tf.Keras (tf-1.15)使用记录3-model.compile方法
  • 本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操
  • Android记事本App设计开发项目实战教程2025最新版Android Studio
  • C++ strcpy和strcat讲解
  • 【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索
  • 我用Ai学Android Jetpack Compose之Box
  • 3 Flink 运行架构
  • 关于系统重构实践的一些思考与总结
  • 攻防世界_PHP2
  • Web-3.0(Solidity)ERC-20
  • 【Uniapp-Vue3】获取用户状态栏高度和胶囊按钮高度
  • 手撕Vision Transformer -- Day1 -- 基础原理
  • 【react-redux】react-redux中的 useDispatch和useSelector的使用与原理解析
  • 2 Flink 部署及启动
  • 基于Python的简单企业维修管理系统的设计与实现
  • TypeScript 运算符
  • 【毕业与课程大作业参考】基于 yolov8+pyqt5 界面自适应的表情识别检测系统 demo
  • Java中对消息序列化和反序列化并且加入到Spring消息容器中
  • 语音识别播报人工智能分类垃圾桶(论文+源码)
  • 使用HttpClient和HttpRequest发送HTTP请求
  • 软件工程中的需求工程
  • 电脑优化大师-解决电脑卡顿问题
  • FFmpeg(7.1版本)编译:Ubuntu18.04交叉编译到ARM
  • Scratch 《像素战场》系列综合游戏:像素战场游戏Ⅰ~Ⅲ 介绍
  • 深入理解linux中的文件(上)