第七章 查找 五、二叉排序树

news2025/2/28 21:40:01

目录

一、定义

二、代码实现

1、查找

2、插入

3、构造

4、删除

三、查找效率分析

1、查找成功ASL

2、查找失败ASL

四、总结


一、定义

二叉排序树(Binary Search Tree,BST)是一种特殊的二叉树,它满足以下条件:

  1. 若左子树不为空,则左子树上所有节点的值(权值)均小于它的根节点的值;

  2. 若右子树不为空,则右子树上所有节点的值(权值)均大于它的根节点的值;

  3. 左、右子树本身也分别为二叉排序树。

二叉排序树的结构可以在查找、插入、删除操作中发挥重要作用,具有快速查找、插入、删除的特点。

二、代码实现

可以使用Binary Search Tree Visualization进行模拟测试。

1、查找

typedef struct TreeNode{
    int data;
    struct TreeNode *lchild,*rchild;
}TreeNode,*BTree;

TreeNode *BST_Search(BTree T,int e){
    while(T!=NULL&&e!=T->data){
        if (e>T->data){//大于
            T = T->rchild;
        } else{//小于
            T = T->lchild;
        }
    }
    return T;
}

2、插入

//递归
int BST_Insert(BTree &T,int k){
    if (T==NULL){
        T=(BTree) malloc(sizeof(TreeNode));
        T->data=k;
        T->lchild=T->rchild=NULL;
        return 1;//插入成功
    } else if (k==T->data){
        return 0;//已存在该值,插入失败
    }
    else if (k<T->data){
        return (BST_Insert(T->lchild,k));//小于,插入左子树
    } else{
        return (BST_Insert(T->rchild,k));//大于,插入右子树
    }
}


//非递归
int BST_Insert1(BTree &T,int k){
    while(T!=NULL){
        if (T->data == k){//存在该值
            return 0;
        }else if (T->data < k){//小于
            if (T->lchild != NULL){//小于且不为叶子节点
                T=T->lchild;
            } else{//小于且为叶子节点
                T->data=k;
                T->lchild=T->rchild=NULL;
            }
        } else{//大于
            if (T->rchild != NULL){//大于且不为叶子节点
                T=T->rchild;
            } else{//大于且为叶子节点
                T->data=k;
                T->lchild=T->rchild=NULL;
            }
        }
    }
}

3、构造

void Creat_Tree(BTree &T,int str[],int n){
    T=NULL;
    int i = 0;
    while(i<n){
        BST_Insert(T,str[i]);
        i++;
    }
}

4、删除

我们寻找代替被删除位置的结点时,有两种方案。

一种是找左子树中最大的值。(中序遍历最后访问的结点)

二是找右子树中最小的值。(中序遍历最先访问的结点)

三、查找效率分析

1、查找成功ASL

在上图中,

第一层的结点要查询一次;

第二层的结点要对比两次;

第三层的结点要对比三次;

第四层的结点要对比四次;

在乘以每层结点的个数,取平均值,就得到了查找成功的ASL;

2、查找失败ASL

在上图中,

查找失败要对比三次的失败节点有7个;

查找失败要对比两次的失败节点有2个;

所以ASL为它们的平均值。

四、总结

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

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

相关文章

计算机竞赛 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

通讯网关软件007——利用CommGate X2Mbt实现Modbus TCP访问MSSQL服务器

本文介绍利用CommGate X2Mbt实现Modbus TCP访问MS SQL数据库。CommGate X2MBT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过Modbus TCP来获取MS SQL数据库的数据。 【解决方案】设…

查看linux是centos还是Ubuntu

查看linux是centos还是Ubuntu 命令&#xff1a;cat /etc/os-release

【操作系统笔记】任务调度信号处理CPU上下文

任务调度 何时需要调度执行一个任务&#xff1f; 第一&#xff1a;当任务创建的时候&#xff0c;需要决定是继续执行父进程&#xff0c;还是调度执行子进程 第二&#xff1a;在一个任务退出时&#xff0c;需要做出调度决策&#xff0c;需要从 TASK_RUNNING 状态的所有任务中选…

java Spring Boot验证码美化,白色背景 随机四个数 每个字随机颜色

我前文 Spring Boot2.7生成用于登录的图片验证码讲述了生成验证码的方法 但是这样生成验证码 非常难看 比较说 验证码是要展示到web程序中的 这样让用户看着 属实不太好 我们可以将接口改成 GetMapping(value "/captcha", produces MediaType.IMAGE_PNG_VALUE) …

Webpack 热更新原理

什么是热更新 模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一。它允许在运行时更新所有类型的模块&#xff0c;而无需完全刷新 一般的刷新我们分两种&#xff1a; 一种是页面刷新&#xff0c;不保留页面状态&#xff0c;就是简单粗暴&#xf…

思维链(Chain-of-Thought Prompting Elicits Reasoning in Large Language Models)

概括 论文主要描述了一种用思维链的提升LLM模型推理能力的方式&#xff0c;并且通过实验的方式&#xff0c;证明了思维链在算术、常识和符号等任务方面的显著效果。仅通过540B大小的PaLM模型&#xff0c;通过8个思维链样例就可以实现在GSM8K上的sota效果。 具体工作 这篇论文…

STM32 OLED屏幕显示详解

目录 1.OLED介绍 2.OLED如何显示一个点&#xff1f; 内存管理​编辑​编辑 页地址模式 水平地址模式​编辑 垂直地址模式 ​编辑 3.OLED显示图片 用到的库函数&#xff1a; 向OLED写命令的封装&#xff1a; 显示图片代码示例&#xff1a; 1.OLED介绍 OLED是有机发光…

论文笔记 DETR

detr 摘要和引言 2020论文facebook不需要proposal&#xff0c;不需要基于anchor的先验知识(比如预训练的模型)&#xff0c;也不需要NMS进行筛选&#xff0c;直接端到端不需要后处理利用transformer的全局建模能力&#xff0c;看成集合预测问题&#xff0c;不会输出很多冗余的…

谷歌AI机器人Bard发布强大更新,支持插件功能并增强事实核查;全面整理高质量的人工智能、机器学习、大数据等技术资料

&#x1f989; AI新闻 &#x1f680; 谷歌AI机器人Bard发布强大更新&#xff0c;支持插件功能并增强事实核查 摘要&#xff1a;谷歌的人工智能聊天机器人Bard发布了一项重大更新&#xff0c;增加了对谷歌应用的插件支持&#xff0c;包括 Gmail、Docs、Drive 等&#xff0c;并…

visual studio 安装包丢失或损坏

visual studio 安装包丢失或损坏 如下图所示为vs2015报错信息。 解决方案&#xff1a; 找到镜像文件或者压缩包的解压位置&#xff1b; 路径&#xff1a;C:\Users\Administrator\Desktop\packages 复制该路径至上图的请提供搜索包的位置。

高项新版教程(第四版)解读+学习指导

第四版主要内容 技术部分 信息化教程、软件工程、网络技术是原来的&#xff0c;学习原来的录播。 新基建、工业互联网、车联网、农业现代化、数字化转型、元宇宙等是新增&#xff0c;以直播讲。 管理部分 变化不是太大 。 整合管理、人力变为资源管理、风险管理新增内容。 …

在VMware虚拟机中固定CentOS系统ip(使用桥接模式)

目录 一、前置说明二、前置准备2.1、切换虚拟机网络为桥接模式2.2、查看本机网络信息 三、配置CentOS系统IP3.1、进入系统输入ip addr 查看本机网络配置名称3.2、查看网络配置目录&#xff0c;网络配置文件名称3.3、修改网络配置文件 ifcfg-ens33 固定IP3.4、重启网络 一、前置…

mysql-connector-java-8.0.11-sources.jar下载后无法运行

目录 问题背景 解决方法 1. 确保驱动已添加到项目中 2. 确保驱动版本与你的代码匹配 问题背景 今天写代码遇到这个报错&#xff0c;解决后发出来分享一下&#xff1a; java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver at java.net.URLClassLoader.findClass…

Kafka 时间轮算法

文章目录 前言Java 任务调度TimerDelayedWorkQueue的最小堆实现 时间轮Kafka中时间轮实现 前言 Kafka中存在大量的延时操作。 发送消息-超时重试机制的延时。ACKS 确认机制的延时。 Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能&#xff0c;而是基于时间轮…

系统架构设计师(第二版)学习笔记----需求工程

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----需求工程 文章目录 一、需求定义1.1 需求包含的内容1.2 软件需求的3个不同层次1.3 需求工程的阶段1.4 需求管理的主要内容 二、需求获取2.1 需求获取的基本步骤2.2 需求获取方法2.3 需求讨论会参与人员2.…

grafana对指标进行组合计算

在使用Grafana配置图表看板时&#xff0c;我们可能需要对多个查询条件筛选出来的结果进行计算&#xff0c;把计算结果生成最终的图表。此时需要用到transform功能【add field from calculation】&#xff1a;

ros2与web通信实例

ros2与web通信实例 最近需要进行ros2与web端进行通信操作&#xff0c;目标是ros2发送的消息web端能够显示在界面&#xff0c;并且前端能够发布数据&#xff0c;最终实例如下&#xff1a; 然而网上查的的资料如古月居的&#xff1a; 利用Websocket实现ROS与Web的交互 https:/…

Appilot发布:打造面向DevOps场景的开源AI助手

今日&#xff0c;数澈软件Seal &#xff08;以下简称“Seal”&#xff09;宣布推出面向 DevOps 场景的 AI 助手 Appilot&#xff0c;这款产品将充分利用 AI 大语言模型的能力为用户提供变革性的部署和应用管理体验。Seal 此次发布的 Appilot 项目&#xff0c;可以让用户直接输入…

使用 sklearn 进行数学建模的通用模板

前言 无论是本科和研究生都会有的数学建模含金量还是很高的&#xff0c;下面将介绍一下进行数学建模的一些基本操作方法&#xff0c;这里主要是利用sklearn 进行建模&#xff0c;包括前期的一些数据预处理以及一些常用的机器学习模型以及一些简单粗暴的通用建模步骤&#xff0…