二叉搜索树(Binary Search Tree,BST)
二叉搜索树(Binary Search Tree,BST)
二叉搜索树(Binary Search Tree),也称二叉查找树或二叉排序树,是一种特殊的二叉树,它满足以下性质
- 对于二叉搜索树的每个节点
- 左子树中的所有节点的值都小于该节点的值
- 右子树中的所有节点的值都大于(或等于)该节点的值
- 对于二叉搜索树的任意节点,其左子树和右子树也是二叉搜索树。

由于这种特性,二叉搜索树可以支持高效地进行查找、插入和删除操作。对于查找操作,可以通过比较目标值与当前节点的值来决定向左子树还是右子树进行搜索。对于插入操作,可以按照比较结果找到合适的位置并插入新节点。对于删除操作,则需要按照一定规则来处理不同情况下的节点删除
插入节点
在二叉搜索树中插入一个新节点的步骤如下:
- 如果树为空,将新节点作为根节点。
- 如果树不为空,从根节点开始遍历树。
- 比较要插入的值与当前节点的值。
- 如果要插入的值小于当前节点的值,向左子树方向继续遍历。
- 如果要插入的值大于当前节点的值,向右子树方向继续遍历。
- 如果要插入的值等于当前节点的值,根据具体需求决定是替换当前节点的值还是忽略该值。
- 当遇到空节点时,表示找到了合适的位置插入新节点。
- 创建一个新节点,并将其插入到空节点的位置。
- 完成插入操作。
示例代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
private TreeNode root;
public BinarySearchTree() {
root = null;
}
// 插入节点
public void insert(int val) {
root = insertNode(root, val);
}
private TreeNode insertNode(TreeNode root, int val) {
// 如果当前节点为空,说明找到了应该插入的位置,创建新节点并返回
if (root == null) {
return new TreeNode(val);
}
// 如果插入的值小于当前节点的值,向左子树插入
if (val < root.val) {
root.left = insertNode(root.left, val);
} else if (val > root.val) {
// 如果插入的值大于当前节点的值,向右子树插入
root.right = insertNode(root.right, val);
}
return root;
}
}
搜索节点(查找)
在二叉搜索树中搜索一个特定值的步骤如下:
- 从根节点开始,将要搜索的值与当前节点的值进行比较。
- 如果要搜索的值等于当前节点的值,返回true,表示找到了目标值。
- 如果要搜索的值小于当前节点的值,则向左子树方向继续搜索。
- 如果要搜索的值大于当前节点的值,则向右子树方向继续搜索。
- 如果遇到空节点,则表示未找到目标值,返回false。
- 重复步骤2至步骤5,直到找到目标值或搜索完整个树。
下面是使用上述步骤实现搜索方法的示例代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
// 搜索节点
public boolean search(int val) {
return searchNode(root, val);
}
private boolean searchNode(TreeNode root, int val) {
// 当前节点为空,未找到目标值
if (root == null) {
return false;
}
// 目标值与当前节点的值相等,找到目标值
if (val == root.val) {
return true;
} else if (val < root.val) {
// 目标值小于当前节点的值,在左子树中继续搜索
return searchNode(root.left, val);
} else {
// 目标值大于当前节点的值,在右子树中继续搜索
return searchNode(root.right, val);
}
}
}
删除节点
在二叉搜索树中删除一个节点的步骤如下:
- 从根节点开始,找到要删除的节点。
- 如果要删除的值等于当前节点的值,根据下面不同的情况进行处理:
a. 若该节点为叶节点(没有子节点),直接删除该节点。
b. 若该节点只有一个子节点,将其子节点替代该节点的位置。
c. 若该节点有两个子节点,找到右子树中最小的节点(或左子树中最大的节点),将该节点的值替代要删除的节点的值,然后递归删除该最小节点(或最大节点)。 - 如果要删除的值小于当前节点的值,则向左子树方向继续搜索。
- 如果要删除的值大于当前节点的值,则向右子树方向继续搜索。
- 当遇到空节点时,表示未找到要删除的节点。
- 完成删除操作。
下面是使用上述步骤实现删除方法的示例代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
private TreeNode deleteNode(TreeNode root, int val) {
// 当前节点为空,未找到要删除的节点
if (root == null) {
return null;
}
// 如果要删除的值小于当前节点的值,在左子树中继续搜索
if (val < root.val) {
root.left = deleteNode(root.left, val);
} else if (val > root.val) {
// 如果要删除的值大于当前节点的值,在右子树中继续搜索
root.right = deleteNode(root.right, val);
} else {
// 找到要删除的节点
// 情况1: 当节点没有子节点时,直接返回 null
if (root.left == null && root.right == null) {
return null;
}
// 情况2: 当节点只有一个子节点时,返回子节点作为当前节点的替代
if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
}
// 情况3: 当节点有两个子节点时,找到右子树中最小的节点,
// 用该节点的值替代当前节点的值,并删除右子树中最小的节点
TreeNode successor = findMin(root.right);
root.val = successor.val;
root.right = deleteNode(root.right, successor.val);
}
return root;
}
private TreeNode findMin(TreeNode node) {
while (node.left != null) {
node = node.left;
}
return node;
}
}
二叉搜索树(Binary Search Tree,BST)的更多相关文章
- 编程算法 - 二叉搜索树(binary search tree) 代码(C)
二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...
- 数据结构 《5》----二叉搜索树 ( Binary Search Tree )
二叉树的一个重要应用就是查找. 二叉搜索树 满足如下的性质: 左子树的关键字 < 节点的关键字 < 右子树的关键字 1. Find(x) 有了上述的性质后,我们就可以像二分查找那样查找给定 ...
- [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记
1. 二叉搜索树,可以用作字典,或者优先队列. 2. 根节点 root 是树结构里面唯一一个其父节点为空的节点. 3. 二叉树搜索树的属性: 假设 x 是二叉搜索树的一个节点.如果 y 是 x 左子树 ...
- 二叉搜索树(Binary Search Tree)(Java实现)
@ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...
- 二叉搜索树(Binary Search Tree)实现及测试
转:http://blog.csdn.net/a19881029/article/details/24379339 实现代码: Node.java //节点类public class Node{ ...
- Lowest Common Ancestor of a Binary Search Tree (BST)
Given a binary search tree(BST), find the lowest common ancestor of two given nodes in the BST. Node ...
- PAT 1099 Build A Binary Search Tree[BST性质]
1099 Build A Binary Search Tree(30 分) A Binary Search Tree (BST) is recursively defined as a binary ...
- UVA 1264 - Binary Search Tree(BST+计数)
UVA 1264 - Binary Search Tree 题目链接 题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是同样的(包含原序列) 思路:先建树,然后dfs一遍,对于一个子树 ...
- Convert Sorted List to Balanced Binary Search Tree (BST)
(http://leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html) Given a singly linked list ...
- Convert Sorted Array to Balanced Binary Search Tree (BST)
(http://leetcode.com/2010/11/convert-sorted-array-into-balanced.html) Given an array where elements ...
随机推荐
- 图书机读目录MARC简介,ISO格式目录数据生成
一.简介 机读目录(Machine-Readable Catalogue,MARC),是利用计算机读取和处理书目信息,是计算机编目的产品. 它以代码形式和特定的结构将书目信息记录在计算机的存储载体上, ...
- NeoVim 学习笔记
NeoVim 学习笔记 这篇学习笔记将用于记录本人在学习使用 NeoVim 编辑器过程中所编写的学习心得与代码.该笔记将会存放在https://github.com/owlman/study_note ...
- JAVA 使用IText7 + Freemarker 动态数据生成PDF实现案例
技术方案:IText7 + Freemarker 技术文档 Itext 官网:https://itextpdf.com/ itext API文档:https://api.itextpdf.com/iT ...
- CentOS 8 已是绝版?还有后续么?
文章由 Linux爱好者( ID: LinuxHub)整理自开源中国 + 红帽官方.本文章经原作者同意后授权转载. 2020年12月8日,CentOS 项目宣布,CentOS 8 将于 2021 年底 ...
- C++面试八股文:在C++中,你知道哪些运算符?
某日二师兄参加XXX科技公司的C++工程师开发岗位第11面: 面试官:在C++中,你都知道都哪些运算符? 二师兄:啥?运算符?+-*/=这些算吗? 面试官:嗯,还有其他的吗? 二师兄:当然还有,+=, ...
- Spring Boot实现高质量的CRUD-2
(续前文) 5.Dao类 Dao类提供操作访问数据库表的接口方法.常规的CRUD,将考虑下列接口方法: 1)插入单条对象记录: 2)批量插入对象记录: 3)修改单条对象记录: ...
- JUC同步锁原理源码解析五----Phaser
JUC同步锁原理源码解析五----Phaser Phaser Phaser的来源 A reusable synchronization barrier, similar in functionalit ...
- Kubernetes(k8s)访问控制:权限管理之RBAC鉴权
目录 一.系统环境 二.前言 三.Kubernetes访问控制 四.鉴权简介 五.配置客户端机器 六.设置k8s集群允许所有请求访问 七.设置k8s集群拒绝所有请求访问 八.RBAC授权 8.1 ro ...
- 聊聊 RocketMQ 主从复制
提到主从复制,我们可能立马会联想到 MySQL 的主从复制. MySQL 主从复制是 MySQL 高可用机制之一,数据可以从数据库服务器主节点复制到一个或多个从节点. 这篇文章,我们聊聊 Rocket ...
- 使用libswresample库实现音频重采样
一.初始化音频重采样器 在音频重采样时,用到的核心结构是SwrContext,我们可以通过swr_alloc()获取swr_ctx实例,然后通过av_opt_set_int()函数和av_opt_se ...