二叉搜索树的思想,以及增删查改的实现
目录
- 搜索树的概念
- 查找操作
- 插入操作
- 删除操作
- 改的操作
搜索树的概念
二叉搜索树又被称为排序树,它或者是一颗空树,或者是一棵具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
下图就是一棵二叉搜索树,可以对应上面性质加深理解:
查找操作
实现思想:
实现代码:
// O(树的高度)public boolean find(int key) {Node current = root;while (current != null) {if (key == current.key) {return true;} else if (key < current.key) {current = current.left;} else {current = current.right;}}return false;}
插入操作
实现思想:
- 如果树为空树,即根 == null,直接插入
- 如果不时空树,按照查找逻辑确定插入位置,插入新节点,这里需要引入两个变量
实现代码:
// O(树的高度)public void insert(int key) {if (root == null) {root = new Node(key);return;}Node parent = null;Node current = root;while (current != null) {if (key == current.key) {throw new RuntimeException("BST 中不允许重复的 key: " + key);} else if (key < current.key) {parent = current;current = current.left;} else {parent = current;current = current.right;}}// 1. 把关键字装入结点中Node node = new Node(key);if (key < parent.key) {parent.left = node;} else {parent.right = node;}}
删除操作
设待删除节点为cur,待删除节点的双亲节点为parent
有以下三种情况:
实现代码:
// O(树的高度)public boolean remove(int key) {Node parent = null;Node current = root;while (current != null) {if (key == current.key) {// 删除 current 中的 keyremoveNode(parent, current);return true;} else if (key < current.key) {parent = current;current = current.left;} else {parent = current;current = current.right;}}return false;}// O(1)private void removeNode(Node parent, Node current) {if (current.left == null) {if (current == root) {root = current.right;} else if (current == parent.left) {parent.left = current.right;} else {parent.right = current.right;}} else if (current.right == null) {if (current == root) {root = current.left;} else if (current == parent.left) {parent.left = current.left;} else {parent.right = current.left;}} else {Node goat = current.right;Node goatParent = current;while (goat.left != null) {goatParent = goat;goat = goat.left;}// 替换current.key = goat.key;// 删除 goat 结点if (goatParent == current) {goatParent.right = goat.right;} else {goatParent.left = goat.right;}}}
改的操作
改的操作和查一模一样,只不过在找到目标节点之后修改它的数值即可。
二叉搜索树的思想,以及增删查改的实现相关推荐
- 数据库基础操作(二)数据库表数据的增删查改
一.插入数据 insert 向表中制定字段添加数据:insert into 表 (字段名1,字段名2......) values(值1,值2......); 向表中所有字段添加数据:insert in ...
- 请回答数据结构【二叉搜索树】
请回答数据结构[二叉搜索树] 1. BinarySearchTree(二叉排序树) 1.0 Intro 1.1 concept 2. 二叉搜索树快速入门 2.1 查找 2.2 BSTree应用 3. ...
- 二叉搜索树,和红黑树,
二叉搜索树 class node():def __init__(self,a):self.val=aself.left=Noneself.right=None #当函数写起来复杂时候,考虑给函数加变量 ...
- gremlin_python使用及增删查改方法封装
文章目录 一.安装Janusgraph 二.连接gremlin 三.增删查改方法封装 四.其他方法封装 五.致谢 一.安装Janusgraph 1.下载安装包 前往janusgraph的官方发布页下载 ...
- 数据结构:二叉搜索树的增删查改
二叉搜索树的增删查改 二叉搜索树(Binary Search Tree) 基本操作之查找(Update) 基本操作之修改(Update) 基本操作之增加(Create) 基本操作之删除(Delete) ...
- [Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]
[二叉搜索树定义](BST) 二叉搜索树(Binary Search Tree,简称 BST)是一种很常用的的二叉树.它的定义是:一个二叉树中,任意节点的值要大于等于左子树所有节点的值,且要小于等于右 ...
- 详解二叉搜索树的增删改查
文章目录 二叉搜索树 1.1 定义 二.二叉搜索树基本结构 三.二叉搜索树的具体实现 3.1 插入节点 3.2 查询节点 3.3 删除节点(⭐️) 3.4 二叉搜索树的遍历 四.二叉搜索树的性能分析和 ...
- 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树
概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...
- 二叉搜索树+快速排序 查到文本中出现频率最多的100个词 【留学生作业】
完整工程 https://download.csdn.net/download/renzemingcsdn/21378979 需求 在这个作业中,你将从一个大文本文件中找到100个最经常出现的单词.程 ...
最新文章
- IT人的自我导向型学习:开篇杂谈
- 完美的素数_JAVA
- 二十年后我发明了保姆机器人作文_我想发明保姆机器人作文700字
- NSFetchedResultsController和UITableView显示CoreData的数据时用relationship分组的方法
- 安装MySQL-python报错 error: command 'gcc' failed with exit status 1解决方法
- clientHeight,offsetHeight,scrollHeight迷一样的三个值
- A轮股权学院:激活股权的力量,弄懂这些就够了
- 全方面的了解超宽带信号高速采集记录回放系统
- VMware vSAN的相关告警处理 2021-01-04
- 解读千人千面,洞悉数据智能的价值(附ppt下载链接)
- 用原生javascript做的一个打地鼠的小游戏
- 数论及Python实践
- VMware网络连接方式(Host-only、NAT、Bridged)介绍及NAT环境下静态IP配置
- spring cloud gateway 拦截request Body
- AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合
- 地铁关门提示音,可使用倒计时
- Android ViewHolder的理解
- machine learning measurements
- NAR:MicrobiomeAnalyst微生物组分析师——统计、可视化和元分析微生物组数据的网页工具
- NodeJS解析前端请求图片链接,将服务器目录下的图片返回给前端用于页面展示
热门文章
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...
- 多对多的添加修改,显示,的逻辑步骤
- SSIS hang with unhandle exception
- ES6学习笔记(四):教你轻松搞懂ES6的新增语法
- react-组件状态机制(五)
- jQueyr源码分析学习笔记(四)
- C++全局变量的声明和定义
- vue 悬浮按钮组件_如何搭建和发布一个 Vue 组件库
- 第1关:HDFS的基本操作
- R7-2 统计字符[2] (10 分)