二叉排序树(二叉搜索树)
二叉排序树(也称为二叉查找树)是一种特殊的二叉树,它可以用来快速查找、插入和删除节点。
二叉排序树有以下性质:
- 在二叉排序树中,左子节点的值总是小于父节点的值。
- 在二叉排序树中,右子节点的值总是大于父节点的值。
- 二叉排序树的中序遍历结果是一个单调递增的序列。
在这个例子中,我们定义了两个类:Node
类和 BinarySearchTree
类。Node
类表示二叉排序树中的一个节点,包含一个数据域和两个指针域。BinarySearchTree
类表示二叉排序树本身,包含根节点和一些操作方法。
这个类实现了二叉排序树的两个常用操作:插入和查找。插入操作使用递归实现,查找操作也是使用递归实现。
下面是java实现的版本
class Node {int value;Node left;Node right;public Node(int value) {this.value = value;left = null;right = null;}
}class BinarySearchTree {Node root;public BinarySearchTree() {root = null;}public void insert(int value) {root = insertRecursive(root, value);}private Node insertRecursive(Node current, int value) {if (current == null) {return new Node(value);}if (value < current.value) {current.left = insertRecursive(current.left, value);} else if (value > current.value) {current.right = insertRecursive(current.right, value);} else {return current;}return current;}public boolean search(int value) {return searchRecursive(root, value);}private boolean searchRecursive(Node current, int value) {if (current == null) {return false;}if (value == current.value) {return true;}return value < current.value? searchRecursive(current.left, value): searchRecursive(current.right, value);}
}
首先来看一下插入操作的流程
参数value为待插入的元素值,current为当前树的根节点
- 首先,如果当前节点为空,说明已经到达了二叉排序树的叶子节点,此时可以直接创建新节点并返回。
- 否则,如果新值小于当前节点的值,则递归调用
insertRecursive
方法,将新值插入到当前节点的左子树中。 - 如果新值大于当前节点的值,则递归调用
insertRecursive
方法,将新值插入到当前节点的右子树中。 - 如果新值等于当前节点的值,则直接返回当前节点,
查找操作
- 首先,如果当前节点为空,说明已经搜索到了二叉排序树的叶子节点,此时可以返回
false
。 - 否则,如果搜索的值等于当前节点的值,则返回
true
。 - 否则,如果搜索的值小于当前节点的值,则递归调用
searchRecursive
方法,在当前节点的左子树中继续搜索。 - 否则,递归调用
searchRecursive
方法,在当前节点的右子树中继续搜索。
删除操作(重点)
public Node deleteNode(Node root, int key) {if (root == null) {return null;}if (key < root.value) {root.left = deleteNode(root.left, key);} else if (key > root.value) {root.right = deleteNode(root.right, key);} else {if (root.left == null) {return root.right;} else if (root.right == null) {return root.left;}root.value = minValue(root.right);root.right = deleteNode(root.right, root.value);}return root;
}
在这个例子中,我们定义了一个名为 deleteNode
的方法,它接受两个参数:根节点和要删除的结点的值。方法体内部实现了删除结点的逻辑。
这段代码的工作流程如下:
- 首先,如果根节点为空,则返回空。
- 如果要删除的结点的值小于根节点的值,则递归调用
deleteNode
方法,在根节点的左子树中继续查找要删除的结点。 - 如果要删除的结点的值大于根节点的值,则递归调用
deleteNode
方法,在根节点的右子树中继续查找要删除的结点。 - 如果要删除的结点的值等于根节点的值,则执行删除操作。
- 如果根节点没有左子树,则返回右子树。
- 如果根节点没有右子树,则返回左子树。
- 否则,找到右子树中最小的结点,并将这个结点的值赋值给根节点。然后递归调用
deleteNode
方法,在根节点的右子树中删除这个最小结点。
删除操作中用到了一个查找子树最小结点值的方法
private int minValue(Node node) {int minv = node.value;while (node.left != null) {minv = node.left.value;node = node.left;}return minv;
}
这段代码的工作流程如下:
首先,将最小值初始化为当前结点的值。
- 循环遍历当前结点的左子树,直到找到最小的结点。
- 返回最小的结点的值。
同样的,我们也可以实现查找二叉排序树的最大值的方法。这个方法的实现方式与查找最小值的方法类似,只是将最小值换成最大值即可。
最后,来看一下二叉排序树的应用案例
- 在数据库的索引中,二叉排序树可以用来快速查找数据。二叉排序树的查找时间复杂度为 O(log n),要比顺序查找的时间复杂度 O(n) 快得多。
二叉排序树还常用于实现字典树(Trie)。字典树是一种树形数据结构,用来存储字符串集合。它的每个结点都包含一个字符,并且满足二叉排序树的性质:左子树的结点代表的字符都比根节点小,右子树的结点代表的字符都比根节点大。因此,我们可以使用二叉排序树来实现字典树。
二叉排序树(二叉搜索树)相关推荐
- 二叉搜索树简介和部分题目
引言 二叉搜索树是一个有序树,遵循以下规则: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉 ...
- 将字符串转换为数组_LeetCode 树 108.将有序数组转换为二叉搜索树
7(108) 将有序数组转换为二叉搜索树 描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 ...
- 二叉搜索树(二叉排序树)
全部数据结构.算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360 二叉搜索树(二叉排序树)(bin ...
- C++ 二叉排序树(二叉查找树、二叉搜索树)
1.定义 二叉排序树(Binary Sort Tree)又称二叉查找树.二叉搜索树. 它或者是一棵空树:或者是具有下列性质的二叉树: 若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若右子 ...
- 数组模拟二叉搜索树(二叉排序树)
文章目录 1. 二叉搜索树的定义 2. 二叉搜索树经典模板 2.1 插入操作(建树操作) 2.2 删除操作 2.3 查询二叉搜索树中值为 w 的前驱/后继数值 3. 经典例题 1. 二叉搜索树的定义 ...
- 二叉搜索树/二叉排序树/二叉查找树
什么是二叉搜索树 二叉搜索树(BST,Binary Search Tree), 也称二叉排序树或二叉查找树 .一棵二叉树,可以为空:如果不为空,满足以下性质: 非空左子树的所有键值小于其根结点的键值( ...
- 详解二叉排序树(二叉搜索树、二叉查找树)以及Python实现相关操作
二叉排序树 引言 1.定义 2.性质 3.操作 3.1 查找 3.2 插入 3.3 生成 3.4 删除 引言 如何更加高效的完成对数据的查询和添加操作,例如↓↓↓ 给你一个数列 (7, 3, 10, ...
- 数据结构二叉排序树建立_数据结构101什么是二叉搜索树
数据结构二叉排序树建立 In everyday life, we need to find things or make decisions, and one way to make that pro ...
- 二叉排序树(二叉搜索树,二叉查找树)
递归实现二叉搜索树(BST)的创建 以数组的形式实现(循环) 以递归的形式实现
- 二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...
本题主要在于考察对二叉搜索树和后序遍历的理解. 原题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同 ...
最新文章
- sudo 密码超时时间
- 设计模式到底离我们有多远
- 结构体数组排列_学习RTOS(3)数据结构
- Java实验7 四、Java异常类(2)创建自己的日期错误异常类
- java 注解 runtime_自定义注解之运行时注解(RetentionPolicy.RUNTIME)
- 为VIP解决问题时写的源码
- 基于 c++ 语言的简易 vim 编辑器
- python简单的分析文本
- solr6.6 导入索引数据
- 问题-[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU)
- 内存映射函数remap_pfn_range学习——示例分析(1)
- NoteExpress样式制作手册
- spark读取文件夹数据
- Java进阶:java程序设计慕课版课后答案浪潮优派
- 数据库的并运算和差运算
- 图像匹配问题的定义和分类
- Oracle--同义词
- 织梦dedecms免费转换到yzmcms教程(含插件下载)
- 《和空姐一起的日子》语录
- Dynamic Selective Network for RGB-D Salient Object Detection