news 2026/5/22 13:24:35

数据结构之二分搜索树 Binary Search Tree

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构之二分搜索树 Binary Search Tree

二分搜索树(BST)是一种有序的二叉树,也是数据结构中最常用的树形结构之一,其核心特性是 “左小右大”,这使得它的查找、插入、删除操作的平均时间复杂度可达 \(O(\log n)\)(最坏为 \(O(n)\),退化为链表),是高效的动态查找 / 排序数据结构。

一、定义

一棵二叉树满足以下条件,则称为二分搜索树:
对于任意节点 node:
其左子树中的所有节点值都 小于 node.val;
其右子树中的所有节点值都 大于 node.val;
左、右子树本身也必须是二分搜索树(递归定义)。
(可选)若需支持重复值,可约定:左子树 ≤ 当前节点 ≤ 右子树(本文默认无重复值)。

二、BST特性
1)中序遍历结果有序:对 BST 进行中序遍历(左→根→右),会得到一个升序排列的序列(核心特性,常用于验证 BST、排序、找前驱 / 后继节点);
2)查找 / 插入 / 删除的高效性:每次操作可排除一半子树,类似二分查找;
3)无唯一形态:同一组数据可构造不同的 BST(如插入顺序不同),极端情况下会退化为单链表(如按升序插入 1,2,3,4,5)。

三、BST性能特征

四、应用场景
1)动态查找 / 排序:支持高效的插入、删除、查找,且中序遍历可直接得到有序序列;
2)集合 / 映射实现:如 Java TreeSet/TreeMap、C++ set/map(底层为红黑树,属于平衡 BST);
3)范围查询:如找 “大于 x 且小于 y 的所有节点”,利用 BST 的有序性可快速定位边界;
4)前驱 / 后继节点查找:如在 BST 中找某个节点的前驱(比它小的最大值)、后继(比它大的最小值),用于排序、TopK 问题。

五、案例分享

题目1:给定一棵二分搜索树和两个结点,寻找这两个结点的最近公共祖先,如下图所示的二分搜索树,2和8的最近公共祖先为6,2和4的最近公共祖先为2。树形结构见下图。

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (null == root) return null; // p and q are in the left side of the tree if (root.val > q.val && root.val > p.val) return lowestCommonAncestor(root.left, p, q); // p and q are in the right side of the tree if (root.val < q.val && root.val < p.val) return lowestCommonAncestor(root.right, p, q); // p and q are in the different sides of the tree,q or p may be is the root node. return root; }

题目2:给定一棵二叉树,验证其是否为二分搜索树。

思路1:根据题目的要求,结点的值大于其左孩子结点的值,而小于其右孩子结点的值,则中序遍历该二叉搜索树时,会返回一个有序的列表。但是若是left.val<=root.val<right.val,这种方式就不行了,此种方式效率较低。

import java.util.LinkedList; import java.util.List; public class LC98 { // 根据题意,中序遍历二叉树,看看是否升序排列 public boolean isValidBST(TreeNode root) { if (null == root) return true; // 此时root肯定不为空 List<Integer> nodeValueList = new LinkedList<>(); inOrder(root, nodeValueList); for(int i = 0;i < nodeValueList.size() - 1;++i) { if(nodeValueList.get(i+1) <= nodeValueList.get(i)) return false; } return true; } private void inOrder(TreeNode root, List<Integer> nodeValueList) { if(null == root) return; inOrder(root.left, nodeValueList); nodeValueList.add(root.val); inOrder(root.right, nodeValueList); } public static void main(String[] args) { TreeNode root = new TreeNode(2); root.left = new TreeNode(1); root.right = new TreeNode(3); System.out.println("result=" + new LC98().isValidBST(root)); } }

思路2:直接使用二分搜索树的性质,左<root<右

public class LC98 { // 根据题意,使用其性质直接判断 左<root<右 public boolean isValidBST(TreeNode root) { if (root == null) return true; return valid(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean valid(TreeNode root, long leftValue, long rightValue) { if (root == null) return true; if (root.val <= leftValue || root.val >= rightValue) return false; return valid(root.left, leftValue, root.val) && valid(root.right, root.val, rightValue); } public static void main(String[] args) { TreeNode root = new TreeNode(10); root.left = new TreeNode(5); root.right = new TreeNode(15); root.right.left = new TreeNode(6); root.right.right = new TreeNode(20); System.out.println("result=" + new LC98().isValidBST(root)); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 11:15:29

43、awk语言的演变、扩展与gawk安装指南

awk语言的演变、扩展与gawk安装指南 1. SVR4与POSIX awk的变化 1992年的POSIX命令语言和实用工具标准为awk语言带来了一系列变化: - 使用 -W 来设置特定于实现的选项。 - 利用 CONVFMT 控制数字到字符串的转换。 - 引入了数字字符串的概念,并制定了更严格的比较规则。 …

作者头像 李华
网站建设 2026/5/21 19:59:20

【完整源码+数据集+部署教程】儿童动画标记检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着信息技术的迅猛发展&#xff0c;计算机视觉领域的研究日益受到关注&#xff0c;尤其是在物体检测和识别方面。儿童动画作为一种重要的文化产品&#xff0c;不仅在娱乐方面具有广泛的影响力&#xff0c;还在教育和心理发展中扮演着不可或缺的角色。近年来&…

作者头像 李华
网站建设 2026/5/10 2:34:36

【完整源码+数据集+部署教程】浮标检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着全球航运业和水上活动的快速发展&#xff0c;浮标作为重要的水上标识和导航工具&#xff0c;其检测与识别的准确性显得尤为重要。浮标不仅在航道标示、气象监测、海洋环境保护等领域发挥着重要作用&#xff0c;还在水上运动、渔业管理等方面具有广泛的应用。因…

作者头像 李华
网站建设 2026/5/9 0:40:00

Snort 入侵检测系统搭建指南

一、安装准备&#xff1a;环境依赖安装 在 CentOS7 系统中搭建 Snort&#xff0c;需先安装必备依赖库与拓展包&#xff0c;确保后续安装顺利进行。 复现平台 天枢一体化虚拟仿真平台 操作系统 CentOS7 1.1 基础依赖库安装 执行以下命令安装核心依赖&#xff1a; sudo yum…

作者头像 李华
网站建设 2026/5/21 8:48:13

JSP中如何利用多线程技术实现大文件并行上传?

大文件传输系统解决方案 作为浙江IT行业软件公司项目负责人&#xff0c;我们面临的大文件传输需求具有很高的技术挑战性。以下是我针对该需求的专业解决方案分析。 需求分析总结 超大文件传输&#xff1a;单文件100GB&#xff0c;文件夹层级结构保持高稳定性&#xff1a;支持…

作者头像 李华
网站建设 2026/5/20 22:22:08

wangEditor处理word文档超链接自动检测功能

【企业级富文本编辑器功能扩展项目纪实——从需求分析到阿里云OSS集成】 2023年X月X日 周X 上海徐汇区 一、需求拆解与核心约束 作为前端工程师&#xff0c;近期接到客户紧急需求&#xff1a;在现有Vue2 wangEditor4的后台系统中新增三大功能&#xff1a; Word粘贴增强&…

作者头像 李华