二叉搜索树(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 ...
随机推荐
- # 代码随想录算法训练营Day28 回溯算法|93.复原IP地址 78.子集 90.子集II
代码随想录算法训练营 93.复原IP地址 题目链接:93.复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 ...
- 卷积神经网络(Convolutional Neural Network,CNN)思想 实例 具体代码实现
在前面我们讨论了神经网络初步,学习了神经网络中最基础的部分:全连接层,并且实现了搭建两层全连接实现图片分类的问题,达到了50%左右的正确率,全连接层的主要思想是构建出一个映射函数,使得前一层的所有输入 ...
- Python异步编程之web框架 异步vs同步 文件IO任务压测对比
测试基本信息 主题:比较异步框架和同步框架在文件IO操作的性能差异 python版本:python 3.8 压测工具:locust web框架:同步:flask 异步:aiohttp.starlett ...
- Junit执行器Runner探索之旅
单元测试是每个程序员必备的技能,而Runner是每个单元测试类必有属性.本文通过解读Junit源码,介绍junit中每个执行器的使用方法,让读者在单元测试时,可以灵活的使用Runner执行器. 一.背 ...
- 前端学习C语言 - 函数和关键字
函数和关键字 本篇主要介绍:自定义函数.宏函数.字符串处理函数和关键字. 自定义函数 基本用法 实现一个 add() 函数.请看示例: #include <stdio.h> // 自定义函 ...
- Task Execution and Scheduling In SpringBoot
开天辟地 Task Execution and Scheduling In the absence of an Executor bean in the context, Spring Boot au ...
- JMH – Java基准测试
官方资源 官方Github样例 应用场景 对要使用的数据结构不确定,不知道谁的性能更好 对历史方法代码重构,要评判改造之后的性能提升多少 (我要做的场景) 想准确地知道某个方法需要执行多长时间,以及执 ...
- 如何在 Windows10 Professional 服务器上搭建自己的 Git 服务器。
一.简介 以前,在别家的公司,一般早就把源代码管理工具搭建好了,很少有机会自己搭建一套.最近,公司也许要把现在不少的源码进行管理,于是我打算自己搭建源代码管理服务器.说起源代码管理,当然有很多中解决方 ...
- Flutter ListView 不满屏 无法滚动
场景: flutter ListView 在做上拉加载的时候,未list添加controller后,数据不满屏,无法滚动 解决: 未listview 设置: physics: const Always ...
- IIS部署的应用无法自动注册到Nacos
问题描述: 自己开发的某系统后台API接入nacos,在IIS上部署无法自动注册到nacos服务列表中.其根本原因是网站处于休眠状态,当某请求访问该网站时,网站被激活,nacos注册成功. 但这块有个 ...