python多种算法对比图解实现 验证二叉树搜索树【力扣98】

简介: python多种算法对比图解实现 验证二叉树搜索树【力扣98】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

python源码解读

程序员必备的数学知识与应用

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

给定一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树 (BST)。一个有效的 BST 定义如下:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
输入格式
  • root:二叉树的根节点。
输出格式
  • 返回布尔值,表示是否为有效的二叉搜索树。

示例

示例 1
输入: root = [2,1,3]
输出: True
解释: 给定二叉树是以下结构,显然是 BST:
    2
   / \
  1   3
示例 2
输入: root = [5,1,4,null,null,3,6]
输出: False
解释: 根节点的右子树包含比根节点小的值 (3 < 5)。

方法一:中序遍历

解题步骤
  1. 递归中序遍历:遍历树,确保遍历出的数值是递增的。
  2. 记录前一个节点值:使用一个变量记录前一个访问的节点值,比较当前节点值是否大于它。
完整的规范代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def isValidBST(root):
    """
    利用中序遍历验证二叉搜索树
    :param root: TreeNode, 二叉树的根节点
    :return: bool, 是否为有效的二叉搜索树
    """
    prev = None
    
    def inorder(node):
        nonlocal prev
        if not node:
            return True
        if not inorder(node.left):
            return False
        if prev is not None and node.val <= prev:
            return False
        prev = node.val
        return inorder(node.right)
    
    return inorder(root)
算法分析
  • 时间复杂度:(O(n)),需要遍历树的所有节点。
  • 空间复杂度:(O(h)),其中 (h) 是树的高度,代表递归栈的最大深度。
算法图解

对于问题 98 “验证二叉搜索树” 使用方法一中序遍历的过程,可以用 ASCII 图解来表示中序遍历的执行过程和节点值的检查。这种表示方式有助于直观地理解如何通过中序遍历确认一个树是否是二叉搜索树(BST)。中序遍历一个有效的 BST 应该产生一个递增的序列。

示例树结构

考虑一个简单的二叉树例子,以便我们可以展示中序遍历的过程:

2
   / \
  1   3

此树的中序遍历结果应该是:1, 2, 3,这是一个递增序列。

ASCII 图解

这里是二叉树的节点及其遍历的 ASCII 表示:

步骤1: 访问根节点 2
步骤2: 移至左子节点 1
步骤3: 打印左子节点 1,回到根节点 2
步骤4: 打印根节点 2,移至右子节点 3
步骤5: 打印右子节点 3

ASCII 图表解释:

2           <- 根节点开始
   / \
  1   3         <- 先访问左子树,然后根节点,最后右子树
中序遍历的步骤

通过中序遍历执行过程,我们可以追踪一个 “prev” 变量(先前访问的节点值),确保当前节点的值大于 “prev”。

中序遍历步骤:
1. 访问节点 2 的左子树(节点 1)
2. 访问节点 1,没有左子树,打印 1,记录 prev = 1
3. 返回到节点 2,prev = 1,当前节点 = 2,2 > 1 成立,打印 2,记录 prev = 2
4. 访问节点 2 的右子树(节点 3)
5. 访问节点 3,没有左子树,打印 3,记录 prev = 3
检查递增序列

每一步中,我们会检查当前节点值是否大于 “prev” 存储的值。如果这一条件在遍历过程中始终满足,那么这棵树是一个有效的二叉搜索树。

ASCII 动态展示
1 -> 2 -> 3     <- 中序遍历结果应该形成递增序列

使用 ASCII 图解来展示中序遍历的过程不仅增加了问题解决步骤的透明度,而且使得算法的验证步骤更加直观易懂,特别适合教学和解释复杂逻辑的场合。

方法二:递归验证

解题步骤
  1. 递归函数:检查每个节点是否满足左 < 当前 < 右的条件。
  2. 参数限制:使用参数 lowhigh 限制节点值的有效范围。
完整的规范代码
def isValidBST(root):
    def validate(node, low=float('-inf'), high=float('inf')):
        if not node:
            return True
        if not (low < node.val < high):
            return False
        return validate(node.left, low, node.val) and validate(node.right, node.val, high)
    
    return validate(root)
算法分析
  • 时间复杂度:(O(n)),需要遍历每个节点。
  • 空间复杂度:(O(h)),递归深度由树的高度决定。

方法三:迭代使用栈

解题步骤
  1. 使用栈:迭代地进行中序遍历。
  2. 检查顺序:确保从栈中弹出的节点值是递增的。
完整的规范代码
def isValidBST(root):
    stack, prev = [], float('-inf')
    
    while stack or root:
        while root:
            stack.append(root)
            root = root.left
        root = stack.pop()
        if root.val <= prev:
            return False
        prev = root.val
        root = root.right
    
    return True
算法分析
  • 时间复杂度:(O(n)),每个节点访问一次。
  • 空间复杂度:(O(h)),栈的大小最多为树的高度。

不同算法的优劣势对比

特征 方法一:中序遍历 方法二:递归验证 方法三:迭代使用栈
时间复杂度 (O(n)) (O(n)) (O(n))
空间复杂度 (O(h)) (O(h)) (O(h))
优势 直观,易于理解 直接,逻辑清晰 避免递归,利于理解
劣势 依赖递归 可能过于复杂 管理栈稍复杂

应用示例

这些方法可以应用于任何需要验证二叉搜索树属性的场景,如数据库索引结构验证、自动化测试中的数据结构验证,或者作为其他算法的预处理步骤,如在进行BST相关的范围查询或平衡操作前验证其属性。


欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
2月前
|
存储 算法 调度
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
104 24
|
2月前
|
人工智能 自然语言处理 算法
阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
本文介绍了阿里云 AI 搜索开放平台的技术的特点及其在各行业的应用。
316 3
|
8天前
|
数据采集 Web App开发 JavaScript
无头浏览器技术:Python爬虫如何精准模拟搜索点击
无头浏览器技术:Python爬虫如何精准模拟搜索点击
|
9天前
|
数据采集 机器学习/深度学习 Web App开发
Python爬虫如何应对贝壳网的IP封禁与人机验证?
Python爬虫如何应对贝壳网的IP封禁与人机验证?
|
8天前
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
37 0
|
4月前
|
机器学习/深度学习 算法
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
174 62
算法系列之搜索算法-深度优先搜索DFS
|
16天前
|
数据采集 存储 数据可视化
2025python实战:利用海外代理IP验证广告投放效果
本文介绍了如何利用Python结合海外代理IP技术,验证广告在不同国家的实际投放效果。通过模拟各地网络环境访问广告页面,检查内容是否与计划一致,并生成曝光报告。具体实现包括:获取高质量代理IP、使用Selenium或Playwright模拟用户行为、解析广告内容及生成可视化报告。案例显示,该方法能有效确保广告精准投放,优化策略并节省预算。
|
4月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
2月前
|
算法 Java Python
使用Python来绘制樱花树
本文以林徽因的《你是人间的四月天》为引,将春日意象与现代职场编程艺术结合,通过Python的Turtle模块绘制分形树和花瓣图案。文章详细解析了Turtle模块的使用方法、递归算法及随机性在图形生成中的应用,展示了如何用代码创造自然美感。核心代码包含tree函数(绘制分形树)和petal函数(绘制花瓣),最终生成一幅生动的春日画卷。项目不仅帮助读者掌握Turtle绘图技巧,更激发对编程艺术的兴趣,鼓励探索数字世界的无限可能。
78 5
|
3月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
92 9
 算法系列之数据结构-二叉树

热门文章

最新文章

推荐镜像

更多