二叉搜索树(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. elment UI + EasyExcel 实现 导入

    前端组件 <hd-flex> <el-dialog v-model="isUploadDialog" width="50%" lock-scr ...

  2. Python潮流周刊#5:并发一百万个任务要用多少内存?

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 博客原文:https://python ...

  3. VSCode 中利用 Remote SSH 连接远程服务器

    北京时间 2019 年 5 月 3 日,在 PyCon 2019 大会上,微软发布了 VS Code Remote.这是一个用来实现远程开发的功能插件,对于许多使用 Windows 进行开发,但是需要 ...

  4. CANoe学习笔记(四):UDS常用否定响应

    UDS中定义的否定响应代码常用的: ServiceNotSupported/服务不支持($11 ) 当诊断仪发送的请求消息中服务标识符无法识别或不支持时,ECU应发送该响应码 SubFunctionN ...

  5. 记一次 .NET 某旅行社审批系统 崩溃分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序跑着跑着就崩溃了,让我看下怎么回事,其实没怎么回事,抓它的 crash dump 就好,具体怎么抓也是被问到的一个高频问题,这里再补一下链接: ...

  6. 【whale-starry-stl】01天 list学习笔记

    一.知识点 1. std::bidirectional_iterator_tag std::bidirectional_iterator_tag 是 C++ 标准库中定义的一个迭代器类型标签,用于标识 ...

  7. 使用 nuxt3 开发简约优雅的个人 blog

    起因 很早前我就有过搭建个人博客的想法,但是我希望使用纯前端实现,这样就不需要付出额外的后端维护成本,维护成本又低,而且更加安全.网上也有很多博客框架但是也不符合我的需求,所以我使用了nuxt3 + ...

  8. Ubuntu系统字体命令和字体的安装

    本人使用的是Windows 10下的WSL,Linux版本是Ubuntu18.04,系统原始是没有安装任何字体的,mkfontscale.mkfontdir和fc-cache命令也是不存在的,直接运行 ...

  9. 1.4 编写简易ShellCode弹窗

    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关于ShellCode的相关知识体系,ShellCode 通常是指一个原始的可执行 ...

  10. 2023-07-04:给定一个数组A, 把它分成两个数组B和C 对于数组A每个i位置的数来说, A[i] = B[i] + C[i] 也就是一个数字分成两份,然后各自进入B和C 要求B[i], C[i

    2023-07-04:给定一个数组A, 把它分成两个数组B和C 对于数组A每个i位置的数来说, A[i] = B[i] + C[i] 也就是一个数字分成两份,然后各自进入B和C 要求B[i], C[i ...