news 2026/6/10 15:56:39

0x3f第七天 二叉搜索树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
0x3f第七天 二叉搜索树

1.前序遍历:

4213657

先验证根是否满足大于左子树最大值,小于右子树最小值

遍历左子树(更新右值)

遍历右子树(更新左值)

对于最大值和最小值,可以直接在函数里加上

def isValidBST(self, root: Optional[TreeNode],left=-inf ,right=inf) -> bool:

先判断边界条件

if root is None:

return True

判断当前节点是否在最大最小值范围

x = root.val

if left< x < right

遍历左子树

self.isValidBST(root.left ,left ,x)更新右最大值为当前节点的val

同理遍历右子树

.....

流程是这样的,直接简写为

return left<x<right and self.isValidBST(root.left ,left ,x) and self.isValidBST(root.right ,x,right)




2.中序遍历:

1234567

先遍历左子树,再根,再右子树,符合思维逻辑,每次比较是否比上一个数大就行

我的问题:1.怎么记录上一个值

2.不能写True的情况 要写False的情况,也就是如果比上一个值大于等于

写了True,代码就结束了

3.pre为什么写在外面,更新的时候为什么是self.pre

给后面每一轮递归都提供一个pre,所以得写在外面,而且还不能写成

def isValidBST(self, root: Optional[TreeNode],pre=-inf)

因为这个pre只有第一次递归的时候能用到,更新不了



后序遍历

1325764

首先后序遍历是 左右根

后序遍历检查搜索二叉树的根本逻辑是判断当前节点是否>左子树的max

<右子树的min

因此引入第二个问题,怎么在递归中传递左子树的max和右子树的min

引入函数def f(node)

if node is None:

return inf, -inf

这样叶子结点就有了它的初始左子树max和右子树min

接下来就是递归这个函数,并修改 这个元祖( , )

lmin,lmax存储左子树的值

lmin,lmax=f(node.left)

rmin,rmax存储右子树的值

rmin,rmax=f(node.right)

处理当前节点:

x = node.val

先写False的情况,那就是不满足上面那个根本逻辑

if x <= l_max or x >= r_min:

return -inf, inf无效标记

else:满足,更新左max,右min

return max(lmax,x),min(rmin,x)

return f(root)[1] != inf或者return f(root)[0] != -inf 这是lmax和rmin的无效标记


【inf, -inf】 = True:表示空集,所以子树形成的集合对父节点没有约束 【-inf, inf】 = False :全集,父节点无论如何不可能有



LCA二叉树最近公共祖先:

1.需要子树信息,告诉父节点是否有目标p,q -> 所以是后序遍历

2.边界问题: 对于None,对于p , 对于q

左遍历右遍历

这两步遍历不做任何决策,只负责 “跑腿收集信息”,给当前节点的判断提供依据。

3.对于当前节点的决策逻辑操作: 如果 if left and right

规则含义:如果左子树找到了有效节点(非 None)、且右子树也找到了有效节点(非 None)→ 说明 p/q 分别在我(当前节点)的左右两侧,我就是它们的 “最近公共祖先”

if left is None:

return right 向下一层递归提供依据


普通二叉树的 LCA 需要遍历到空节点才能确定 “子树无 p/q”,但 BST 的特性让递归在找到 LCA 时直接返回,不会走到空节点


LCA搜索二叉树最近公共祖先

二叉搜索树的特性:

如果要找的值都小于当前节点,那就递归左子树

反之,递归右子树

如果都不是那就只剩三种情况1.此节点为p2.此节点为q3.此节点为祖先

直接return root就是

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:35:20

选对语言,赢在起点!新手 C、Java、Python 指南uT#45篇

SQLAlchemy是Python中最流行的ORM&#xff08;对象关系映射&#xff09;框架之一&#xff0c;它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华
网站建设 2026/6/10 11:36:02

C++课后习题训练记录Day52

1.练习项目&#xff1a; 练习使用map函数及其常用函数 2.选择课程 在蓝桥云课中选择课程《16届蓝桥杯省赛无忧班&#xff08;C&C 组&#xff09;4期》&#xff0c;选择第STL”课程16并开始练习。 3.开始练习 &#xff08;1&#xff09;源码&#xff1a; #include<…

作者头像 李华
网站建设 2026/6/9 17:40:41

FastAPI 流式响应中,如何优雅处理客户端断连后的数据库操作?

问题出现过程1. 客户端发起流式对话请求我们从一个典型的流式对话接口开始。我们使用依赖注入来获取一个 SQLAlchemy 的 AsyncSession&#xff0c;在对话开始时创建消息&#xff0c;在对话结束后更新 AI 的回答。流式对话原始代码&#xff08;伪代码&#xff09;2. 客户端取消对…

作者头像 李华
网站建设 2026/6/9 23:48:29

【elementUI】form表单rules没生效

关键原则是&#xff1a; 中的 prop 值必须与验证规则对象中的键名完全一致。对于嵌套属性如 info.modelId&#xff0c;需要在两个地方都指定完整的路径。<template><el-form :model"editForm" ref"editRef" :rules"editFormRules">&…

作者头像 李华
网站建设 2026/6/10 11:42:59

天津到潍坊危险品物流运输公司 | 天津危化品专线直达潍坊 | 危险品仓储运输一体化

全链条服务覆盖天津至潍坊的危化品运输通道已形成成熟服务体系&#xff0c;覆盖全国34个省级行政区域&#xff0c;重点辐射京津冀、长三角及珠三角经济带。该线路支持医疗废弃物、腐蚀性化学品等9大类危险品运输&#xff0c;配套智能仓储系统实现货物分类存储与全流程溯源管理。…

作者头像 李华
网站建设 2026/6/10 11:40:34

学GIS开发,都应该了解的顺序!

01 学习人群一般来说&#xff0c;学习WebGIS开发的人员有两类。其中较为庞大的群体是3S&#xff08;GIS、RS、GNSS&#xff09;及相关专业的学生&#xff1b;另一类是计算机专业的学生2024年陆续也有一些其他专业的人士也对进入WebGIS开发行业感兴趣&#xff0c;这里不多赘述。…

作者头像 李华