二叉搜索树(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 ...
随机推荐
- 一次 HPC 病毒感染与解决经历
周一的时候,有同事反馈说,HPC 的项目报告路径正在不断产生 *.exe 和 *.pif 文件,怀疑是不是被病毒感染! 收到信息,第一时间进去目录,的确发现该目录每个几秒钟就自动生成一个 *.exe ...
- 文档在线预览(四)将word、txt、ppt、excel、图片转成pdf来实现在线预览
@ 目录 事前准备 1.需要的maven依赖 2.后面用到的工具类代码: 一.word文件转pdf文件(支持doc.docx) 二.txt文件转pdf文件 三.PPT文件转pdf文件(支持ppt.pp ...
- Qt6使用SeriaPortl包
简介: 最近使用Qt6.0开发一个自己串口小工具的时候,遇到了没有QtSerialPort包的情况,一番折腾终于找到了解决方案... 一. 在系统自带的卸载更改程序中,找到Qt,点击卸载 二. 点击添 ...
- 【PAT】 1002 写出这个数 Rust Solution
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10100. 输出格式: 在一行 ...
- CompletableFuture之批量上传
前言 最近接到一个需求,批量上传图片到服务器及实时更新上传进度.当处理大量文件上传任务时,效率是一个关键因素.传统的串行方式会导致任务耗时较长,而使用并发处理可以极大地提高上传效率.想到很久之前用Co ...
- C#中数组=out参数?
- 结论 先上结论,答案是yes,C#中数组确实具有out参数的特性. - 疑问 最近开发一个上位机的功能,有段代码看得我一直很迷糊,我的认识,函数的执行结果,要么在函数中通过return返回,要么通 ...
- Github的一个彩蛋
点击新建仓库 项目名称为自己的昵称 下方提示意思说: 你发现了一个秘密 这是一个特别的仓库 你可以为你的首页增加README.md 就像给项目介绍一样,这是你的自我介绍 点击编辑,里面会与建议模板 以 ...
- maven报错:不再支持源选项 5。请使用 6 或更高版本
问题描述 在执行命令 mvn compile 发生错误 D:\Github_NOTES\JavaWeb_Learning\02Java\JavaWeb\Code\Maven1>mvn clean ...
- 利用java来实现计算器的加减乘除
package bag; import java.util.Scanner; public class Demo06 { public static void main(String[] args) ...
- 将mongodb注册成windows(win10)的服务
首先参考这个大佬的文章: 下载mongodb 然后解压 为了方便路径,我改了个名字MongoDB, 然后把它拖到了c盘的Program Files文件夹中 这样他的路径就是 (这个路径在很多地方都要用 ...