二叉排序树(也称为二叉查找树)是一种特殊的二叉树,它可以用来快速查找、插入和删除节点。

二叉排序树有以下性质:

  1. 在二叉排序树中,左子节点的值总是小于父节点的值。
  2. 在二叉排序树中,右子节点的值总是大于父节点的值。
  3. 二叉排序树的中序遍历结果是一个单调递增的序列。

在这个例子中,我们定义了两个类: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为当前树的根节点

  1. 首先,如果当前节点为空,说明已经到达了二叉排序树的叶子节点,此时可以直接创建新节点并返回。
  2. 否则,如果新值小于当前节点的值,则递归调用 insertRecursive 方法,将新值插入到当前节点的左子树中。
  3. 如果新值大于当前节点的值,则递归调用 insertRecursive 方法,将新值插入到当前节点的右子树中。
  4. 如果新值等于当前节点的值,则直接返回当前节点,

查找操作

  1. 首先,如果当前节点为空,说明已经搜索到了二叉排序树的叶子节点,此时可以返回 false
  2. 否则,如果搜索的值等于当前节点的值,则返回 true
  3. 否则,如果搜索的值小于当前节点的值,则递归调用 searchRecursive 方法,在当前节点的左子树中继续搜索。
  4. 否则,递归调用 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 的方法,它接受两个参数:根节点和要删除的结点的值。方法体内部实现了删除结点的逻辑。

这段代码的工作流程如下:

  1. 首先,如果根节点为空,则返回空。
  2. 如果要删除的结点的值小于根节点的值,则递归调用 deleteNode 方法,在根节点的左子树中继续查找要删除的结点。
  3. 如果要删除的结点的值大于根节点的值,则递归调用 deleteNode 方法,在根节点的右子树中继续查找要删除的结点。
  4. 如果要删除的结点的值等于根节点的值,则执行删除操作。
  5. 如果根节点没有左子树,则返回右子树。
  6. 如果根节点没有右子树,则返回左子树。
  7. 否则,找到右子树中最小的结点,并将这个结点的值赋值给根节点。然后递归调用 deleteNode 方法,在根节点的右子树中删除这个最小结点。

删除操作中用到了一个查找子树最小结点值的方法

private int minValue(Node node) {int minv = node.value;while (node.left != null) {minv = node.left.value;node = node.left;}return minv;
}

这段代码的工作流程如下:

首先,将最小值初始化为当前结点的值。

  1. 循环遍历当前结点的左子树,直到找到最小的结点。
  2. 返回最小的结点的值。

同样的,我们也可以实现查找二叉排序树的最大值的方法。这个方法的实现方式与查找最小值的方法类似,只是将最小值换成最大值即可。

最后,来看一下二叉排序树的应用案例

  1. 在数据库的索引中,二叉排序树可以用来快速查找数据。二叉排序树的查找时间复杂度为 O(log n),要比顺序查找的时间复杂度 O(n) 快得多。
  2. 二叉排序树还常用于实现字典树(Trie)。字典树是一种树形数据结构,用来存储字符串集合。它的每个结点都包含一个字符,并且满足二叉排序树的性质:左子树的结点代表的字符都比根节点小,右子树的结点代表的字符都比根节点大。因此,我们可以使用二叉排序树来实现字典树。

二叉排序树(二叉搜索树)相关推荐

  1. 二叉搜索树简介和部分题目

    引言 二叉搜索树是一个有序树,遵循以下规则: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉 ...

  2. 将字符串转换为数组_LeetCode 树 108.将有序数组转换为二叉搜索树

    7(108) 将有序数组转换为二叉搜索树 描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 ...

  3. 二叉搜索树(二叉排序树)

    全部数据结构.算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360 二叉搜索树(二叉排序树)(bin ...

  4. C++ 二叉排序树(二叉查找树、二叉搜索树)

    1.定义 二叉排序树(Binary Sort Tree)又称二叉查找树.二叉搜索树. 它或者是一棵空树:或者是具有下列性质的二叉树: 若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若右子 ...

  5. 数组模拟二叉搜索树(二叉排序树)

    文章目录 1. 二叉搜索树的定义 2. 二叉搜索树经典模板 2.1 插入操作(建树操作) 2.2 删除操作 2.3 查询二叉搜索树中值为 w 的前驱/后继数值 3. 经典例题 1. 二叉搜索树的定义 ...

  6. 二叉搜索树/二叉排序树/二叉查找树

    什么是二叉搜索树 二叉搜索树(BST,Binary Search Tree), 也称二叉排序树或二叉查找树 .一棵二叉树,可以为空:如果不为空,满足以下性质: 非空左子树的所有键值小于其根结点的键值( ...

  7. 详解二叉排序树(二叉搜索树、二叉查找树)以及Python实现相关操作

    二叉排序树 引言 1.定义 2.性质 3.操作 3.1 查找 3.2 插入 3.3 生成 3.4 删除 引言 如何更加高效的完成对数据的查询和添加操作,例如↓↓↓ 给你一个数列 (7, 3, 10, ...

  8. 数据结构二叉排序树建立_数据结构101什么是二叉搜索树

    数据结构二叉排序树建立 In everyday life, we need to find things or make decisions, and one way to make that pro ...

  9. 二叉排序树(二叉搜索树,二叉查找树)

    递归实现二叉搜索树(BST)的创建 以数组的形式实现(循环) 以递归的形式实现

  10. 二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...

    本题主要在于考察对二叉搜索树和后序遍历的理解. 原题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同 ...

最新文章

  1. sudo 密码超时时间
  2. 设计模式到底离我们有多远
  3. 结构体数组排列_学习RTOS(3)数据结构
  4. Java实验7 四、Java异常类(2)创建自己的日期错误异常类
  5. java 注解 runtime_自定义注解之运行时注解(RetentionPolicy.RUNTIME)
  6. 为VIP解决问题时写的源码
  7. 基于 c++ 语言的简易 vim 编辑器
  8. python简单的分析文本
  9. solr6.6 导入索引数据
  10. 问题-[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU)
  11. 内存映射函数remap_pfn_range学习——示例分析(1)
  12. NoteExpress样式制作手册
  13. spark读取文件夹数据
  14. Java进阶:java程序设计慕课版课后答案浪潮优派
  15. 数据库的并运算和差运算
  16. 图像匹配问题的定义和分类
  17. Oracle--同义词
  18. 织梦dedecms免费转换到yzmcms教程(含插件下载)
  19. 《和空姐一起的日子》语录
  20. Dynamic Selective Network for RGB-D Salient Object Detection

热门文章

  1. 天威诚信董事长陈韶光、首席安全官李延昭入选武汉仲裁委员会仲裁员
  2. 旺店通·企业奇门和用友BIP接口打通对接实战
  3. 复制淘宝店需要设置那些?
  4. JMS之——JMS简介
  5. medusa破解ssh
  6. OpenCV配置(利用Source编译,并配置扩展库opencv_contrib)
  7. Juniper 路由架构
  8. 【Android】Android入门
  9. Cookie是什么?从哪来?存在哪?往哪去?
  10. 上海育才高中2021高考成绩查询,育才中学2018高考成绩