二叉搜索树(Binary Search Tree,BST)

二叉搜索树(Binary Search Tree),也称二叉查找树或二叉排序树,是一种特殊的二叉树,它满足以下性质

  1. 对于二叉搜索树的每个节点

    • 左子树中的所有节点的值都小于该节点的值
    • 右子树中的所有节点的值都大于(或等于)该节点的值
  2. 对于二叉搜索树的任意节点,其左子树和右子树也是二叉搜索树。

由于这种特性,二叉搜索树可以支持高效地进行查找、插入和删除操作。对于查找操作,可以通过比较目标值与当前节点的值来决定向左子树还是右子树进行搜索。对于插入操作,可以按照比较结果找到合适的位置并插入新节点。对于删除操作,则需要按照一定规则来处理不同情况下的节点删除

插入节点

在二叉搜索树中插入一个新节点的步骤如下:

  1. 如果树为空,将新节点作为根节点。
  2. 如果树不为空,从根节点开始遍历树。
  3. 比较要插入的值与当前节点的值。
    • 如果要插入的值小于当前节点的值,向左子树方向继续遍历。
    • 如果要插入的值大于当前节点的值,向右子树方向继续遍历。
    • 如果要插入的值等于当前节点的值,根据具体需求决定是替换当前节点的值还是忽略该值。
  4. 当遇到空节点时,表示找到了合适的位置插入新节点。
  5. 创建一个新节点,并将其插入到空节点的位置。
  6. 完成插入操作。

示例代码:

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;
}
}

搜索节点(查找)

在二叉搜索树中搜索一个特定值的步骤如下:

  1. 从根节点开始,将要搜索的值与当前节点的值进行比较。
  2. 如果要搜索的值等于当前节点的值,返回true,表示找到了目标值。
  3. 如果要搜索的值小于当前节点的值,则向左子树方向继续搜索。
  4. 如果要搜索的值大于当前节点的值,则向右子树方向继续搜索。
  5. 如果遇到空节点,则表示未找到目标值,返回false。
  6. 重复步骤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);
}
}
}

删除节点

在二叉搜索树中删除一个节点的步骤如下:

  1. 从根节点开始,找到要删除的节点。
  2. 如果要删除的值等于当前节点的值,根据下面不同的情况进行处理:

    a. 若该节点为叶节点(没有子节点),直接删除该节点。

    b. 若该节点只有一个子节点,将其子节点替代该节点的位置。

    c. 若该节点有两个子节点,找到右子树中最小的节点(或左子树中最大的节点),将该节点的值替代要删除的节点的值,然后递归删除该最小节点(或最大节点)。
  3. 如果要删除的值小于当前节点的值,则向左子树方向继续搜索。
  4. 如果要删除的值大于当前节点的值,则向右子树方向继续搜索。
  5. 当遇到空节点时,表示未找到要删除的节点。
  6. 完成删除操作。

    下面是使用上述步骤实现删除方法的示例代码:
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)的更多相关文章

  1. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  2. 数据结构 《5》----二叉搜索树 ( Binary Search Tree )

    二叉树的一个重要应用就是查找. 二叉搜索树 满足如下的性质: 左子树的关键字 < 节点的关键字 < 右子树的关键字 1. Find(x) 有了上述的性质后,我们就可以像二分查找那样查找给定 ...

  3. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记

    1. 二叉搜索树,可以用作字典,或者优先队列. 2. 根节点 root 是树结构里面唯一一个其父节点为空的节点. 3. 二叉树搜索树的属性: 假设 x 是二叉搜索树的一个节点.如果 y 是 x 左子树 ...

  4. 二叉搜索树(Binary Search Tree)(Java实现)

    @ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...

  5. 二叉搜索树(Binary Search Tree)实现及测试

    转:http://blog.csdn.net/a19881029/article/details/24379339 实现代码:  Node.java  //节点类public class Node{ ...

  6. 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 ...

  7. 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 ...

  8. UVA 1264 - Binary Search Tree(BST+计数)

    UVA 1264 - Binary Search Tree 题目链接 题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是同样的(包含原序列) 思路:先建树,然后dfs一遍,对于一个子树 ...

  9. 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 ...

  10. 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 ...

随机推荐

  1. Quartz + SpringBoot 实现定时任务(多任务,多执行时间)代码模板(直接CV即可)

    一,什么是Quartz quartz 是一款开源且丰富特性的Java 任务调度库,用于实现任务调度和定时任务.它支持各种任务类型和灵活的配置选项,具备作业持久化.集群和分布式调度.错误处理和重试机制等 ...

  2. R语言中的跨平台支持:如何在Windows、MacOS和Linux上使用R语言进行数据分析和可视化

    目录 当今数据科学领域,R语言已经成为了数据分析和可视化的流行工具.R语言具有强大的功能和灵活性,使得它可以在各种不同的平台上运行,包括Windows.MacOS和Linux.因此,本文将介绍R语言中 ...

  3. Python编程和数据科学中的机器学习:如何处理和可视化具有噪声和干扰的数据

    目录 随着数据科学和机器学习的快速发展,处理和分析具有噪声和干扰的数据成为了一个日益重要的挑战.在数据科学和机器学习中,噪声和干扰通常来自于各种因素,例如随机性和非随机性,数据缺失,数据集中的错误或错 ...

  4. 续《基于C# 开发的SOL SERVER 操作数据库类(SQLHelp》 ——第二弹

    续上一节,本节给出SQLHelp的具体实现方法--<YSFSQLHelp>,个人根据自己需要新建适合的类,本节根据参考网上资料,根据自己的需要编写的SQL帮助类.下面直接给出具体实现: / ...

  5. 2023-07-06:RabbitMQ中的AMQP是什么?

    2023-07-06:RabbitMQ中的AMQP是什么? 答案2023-07-06: AMQP AMQP(Advanced Message Queuing Protocol)是一个应用层协议的开放标 ...

  6. HCL实验:4.同一vlan位于不同交换机上的通信

    拓扑图 SW1配置 SW2配置 SW3配置 VLAN 1 PC1 PING PC5 VLAN 2 PC 2 PING PC 6 VLAN 3 PC4 PING PC8 怀疑是模拟器的问题---- 不知 ...

  7. 防缓存穿透利器-布隆滤器(BloomFilter)

    布隆过滤器 1.布隆过滤器原理 1.1 什么是布隆过滤器 1.2 使用场景 1.3 原理 1.4 布隆过滤器的优缺点 2.实现方式 2.1 初始化skuId的布隆过滤器 2.1.1 RedisCons ...

  8. Spring的Bean标签配置(一)

    Bean标签基本配置 由于配置对象交由Spring来创建 默认情况下它调用的的是类中的无参构造函数,如果没有无参构造函数则不会创建成功 id:唯一标识符号,反射是通过无参构造创建对象的. class: ...

  9. PostgreSQL 10 文档: SQL 语法

    SQL 命令   这部分包含PostgreSQL支持的SQL命令的参考信息.每条命令的标准符合和兼容的信息可以在相关的参考页中找到. 目录 ABORT - 中止当前事务 ALTER AGGREGATE ...

  10. nf_conntrack: table full, dropping packet

    参考:linux 路由跟踪表满错误 nf_conntrack: table full, dropping packet 原理解决方法 说明 ping,dmesg 或者 /var/log/message ...