二叉搜索树

    • 如何搜索
    • 构建一颗二叉搜索树
      • 插入
      • 删除

如何搜索

在这里插入图片描述
在二叉搜索树里搜索值;搜索非常类似于二分查找

//查找key是否存在public TreeNode search(int key) {TreeNode cur = root;while(cur != null) {if(cur.key == key) {return cur;}else if(cur.key > key){cur = cur.left;}else {cur = cur.right;}}return null;}

最好的情况是这颗搜索树是一个完全二叉树;时间复杂度O(log n);最坏情况是单边的树;时间复杂度O(N)
在这里插入图片描述

构建一颗二叉搜索树

假设给你一串没有重复的数字;你如何构建出一棵搜索树?

插入

第一次插入的节点是根节点;其次每个节点都是在叶子节点的位置插入;cur从根节点开始走;cur为空的时候就是我们插入的时候,定义一个parent记录cur父亲的位置(因为我们cur只是找到空的节点;虽然我们是一步一步比较下来;但是走下来;我们得记录cur是从哪个节点走下来的;知道它的父亲才能插入)

 public boolean insert(int key) {if(root == null) {//没有节点的时候得注意;直接插入根节点就行root = new TreeNode(key);}TreeNode prev = null;TreeNode cur = root;while(cur != null) { //找位置if(cur.val == key) {//值相同时不给插入return false;}else if(cur.val > key) {prev = cur;cur = cur.left;}else { prev = cur;cur = cur.right;}}//上述找到cur为空;但是不知道是左边还是右边走下来空了;所以我们需要和父亲比较一下if(prev.val > key) {prev.left = new TreeNode(key);}else {prev.right = new TreeNode(key);}return true;}

在这里插入图片描述

删除

假设:删除结点为 cur, 待删除结点的双亲结点为 parent
删除分三种情况:
大前提1:cur.left==null ;左边没有树
1:删除根节点;cur是root;删除方案root=cur.right。
在这里插入图片描述

2:删除上一个根节点的左孩子
cur是parent.left;删除方案parent.left=cur.right
在这里插入图片描述
3:cur 是 parent.right, 删除方案parent.right = cur.right
在这里插入图片描述
实现:


找位置先;

大前提2:cur.right==null ;右边没有树
1:删除根节点;删除方案root=cur.left
在这里插入图片描述
2:cur 是 parent.left,删除方案parent.left = cur.left
在这里插入图片描述
3:cur是patent.right;解决方案parent.right=cur.left
在这里插入图片描述

大前提3:左右都不为空;例如删除12
在这里插入图片描述
第三种并不是真正意义上的删除;两种方式,找到左边的最大值,或者右边的最小值。也就是左边的最右,或者右边的最左。9或者13.(然后一步一步找到这个位置,把我的12改成13或者9)然后再让这个9等于它自己的右边,或者13等于13的左边。这样这个节点就变为空了.
如果:右边的左为空,只有右。就直接把25给12,然后25指向16,删除这个重复的25,

整体代码:

 public void removeNode(TreeNode preant,TreeNode cur){if(cur.left==null){if(cur==root){root=cur.right;}else if(cur==preant.left){preant.left=cur.right;}else {preant.right=cur.right;}} else if(cur.right==null){if(cur==root){root=cur.left;}else if(cur==preant.left){preant.left=cur.left;}else {preant.right=cur.left;}}else {//两边都不为空TreeNode target=cur.right;TreeNode targetParent=cur;while (target.left!=null){targetParent=target;target=target.left;}cur.val=target.val;if(target==targetParent.left) {targetParent.left = target.right;}else {targetParent.right=target.right;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python运算符/部分函数对应的双下划线魔法方法

先说下Python版本:【Python 3.7.8】 以下用图片表格展示,一是防扒,二是没精力改成md格式。 还有就是内容肯定没有完全包含(而且也很难做到),像是__reduce__与py自带模块pickle有关(pickle用于对象序列化/反序列化)、sys.getsizeo…

SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)

1.SQLAlchemy是什么? SQLAlchemy 是 Python 著名的 ORM 工具包。通过 ORM,开发者可以用面向对象的方式来操作数据库,不再需要编写 SQL 语句。 SQLAlchemy 支持多种数据库,除 sqlite 外,其它数据库需要安装第三方驱动。…

20230904 QT客户端服务器搭建聊天室

Ser cpp#include "app.h" #include "ui_app.h"APP::APP(QWidget *parent):QWidget(parent),ui(new Ui::APP) {ui->setupUi(this);this->resize(550,400);ui->Line->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中ui->Line->se…

力扣:83. 删除排序链表中的重复元素(Python3)

题目: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚…

群晖NAS:通过Docker 部署宝塔面板【注册表:cyberbolt/baota】

群晖NAS:通过 Docker 部署宝塔面板【注册表:pch18/baota】 由于 docker 源地址被墙,在面板里面查询不到注册表,使用 ssh 命令行拉取 1、打开 SSH,链接后打开命令行 这里不赘述,具体自行百度 2、下载 镜像…

origin中optimal cluster安装报错解决

1.在安装之后程序运行出错,报错信息为缺少numpy包。解决办法:打开窗口-脚本窗口,用pip安装numpy,其他缺少的包可用同样方法解决。 2.有的包在外部python中才有,通过origin无法下载。解决办法:在连接-python…

PHP对接阿里云虚拟号的实现(号码隐私保护)

fastadmin 封装框架 实现功能:AXN隐私号绑定、解绑; 场景:为店铺手机号开通虚拟号,用户联系店铺展示虚拟号码; 官方开放文档地址:https://help.aliyun.com/document_detail/59655.html?spma2c4g.111742…

营销邮件主题怎么写?编写邮件主题的技巧?

如何创建营销邮件主题?制作EDM邮件主题的方法策略? 营销邮件主题在整个营销邮件中起着至关重要的作用,它是吸引读者打开邮件的第一步。蜂邮EDM将分享一些关于如何撰写令人惊艳的营销邮件主题的技巧,帮助您吸引更多的目标受众。 …

【高德地图】 覆盖物/画点/画折线/画多边形/画矩形/画圆

官方示例 https://lbs.amap.com/demo/javascript-api/example/mouse-operate-map/mouse-draw-overlayers <!doctype html> <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content…

微信小程序中 vant weapp 使用外部的icon作为图标的步骤

微信小程序中 vant weapp 使用外部的icon作为图标的步骤 1. 在项目中创建静态资源文件夹2. 前往iconfont图标官网&#xff0c;添加图标并拷贝在线链接3. 下载iconfont代码&#xff0c;解压之后拷贝到小程序的目录中4. 修改iconfont.wxss 将本地链接替换为在线链接5. 在项目的ap…

巨额亏损,股价遭受重创,Polestar极星汽车已陷入困境

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 8月31日&#xff0c;由吉利汽车&#xff08;00175&#xff09;和沃尔沃汽车合资创建的瑞典电动汽车公司Polestar极星汽车&#xff08;PSNY&#xff09;公布了2023年第二季度财报。 这家电动汽车公司在去年通过SPAC上市后&am…

Flink+Flink CDC版本升级的依赖问题总结

之前使用Flink1.13Flink CDC2.0同步MySQL数据&#xff0c;想测试一下最新的几个版本。但是各种依赖冲突的报错&#xff0c;经过一段时间的调试&#xff0c;终于解决&#xff0c;现在总结一下。 1、flink1.15前后jar包名称不一样 flink-streaming-java、flink-clients、flink-…

电子产品CE认证申请,CE-RED认证

CE认证&#xff0c;即只限于产品不危及人类、动物和货品的安全方面的基本安全要求&#xff0c;而不是一般质量要求&#xff0c;协调指令只规定主要要求&#xff0c;一般指令要求是标准的任务。 构成欧洲指令核心的"主要要求"&#xff0c;在欧共体1985年5月7日的&…

k8s集群中ETCD备份和恢复

文章目录 [toc]一、etcd 概述二、安装etcdctl工具三、kubeadm部署方式部署1&#xff09;备份2&#xff09;恢复四、定时备份 五、二进制部署备份1&#xff09;备份2&#xff09;恢复1、停止apiserver和etcd2、etcd_1恢复3、etcd_2恢复4、etcd_3恢复5、启动etcd和apiserver6、检…

使用正则表达式总结

多行匹配 使用Pattern.DOTALL | Pattern.MULTILINE参数 Pattern.CASE_INSENSITIVE&#xff1a;不区分大小写 public static void main(String[] args) {String teststr "AA aa AASSF \n\r */ DDET AA";String regStr "(?AA)\\w\\b";extracted(testst…

基于Java+SpringBoot+Vue前后端分离交通管理在线服务系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

基于SSM的汽车客运站管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

电工什么是电动势

什么是电动势&#xff1f;及电源电动势计算公式与方向确定 前面我们讲到在基本电路中的电流和电压的基础知识&#xff0c;而本文要讲的电动势和电压是一个很类似的概念。那么什么是电动势&#xff1f;电源电动势的计算公式是什么&#xff1f;它的方向如何确定及与电压有什么区…

FPGA时序分析与约束(5)——时序路径

一、前言 在之前的文章中我们分别介绍了组合电路的时序&#xff0c;时序电路的时序和时钟的时序问题&#xff0c;我们也对于时序分析&#xff0c;时序约束和时序收敛几个基本概念进行了区分&#xff0c;在这篇文章中&#xff0c;我们将介绍时序约束相关的最后一部分基本概念&am…

用半天时间从零开始复习前端之html

目录 前言 科班生的标配&#xff1a;半天听完一门标记型语言 准备工作 webstorm2022 webstrom 第一个html页面 body h系列标签 行标签和块标签 列表标签 表格标签&#xff08;另起一篇&#xff09; 万能的input 1.快速生成多个标签 2.同时选中多个 前言 科班生的标…