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

2023-09-20 23:21:29

目录

一、定义

二、代码实现

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为它们的平均值。

四、总结

更多推荐

IP代理与加速器:理解它们的区别与共同点

目录一、IP代理的基本概念与作用1、IP代理的定义2、IP代理的作用二、加速器的基本概念与作用1、加速器的定义2、加速器的作用三、IP代理与加速器的异同点1、相同点2、不同点四、都有什么优缺点五、各自在什么场合下使用六、该怎么选择总结在互联网的汪洋大海中,我们有时会遇到各种网络问题,如地区限制、网络延迟、封锁等。这时,

网页订货系统的诸多优势|企业APP订单管理软件

1.订单信息,发货信息,账目信息一目了然生产企业(总代理)和分销商之间可以清楚直观的了解到商品和货款的实时状态,以便高效的订货,发货,进行货款催收以及商品的物流跟踪。2.建立稳固的客户关系,避免客户被竞争对手挖墙脚有了网上订货系统,企业(总代理)和分销商之间的联系更加紧密,账目更加清晰,客户信任度和忠诚度大大提升,有效

单片机操作系统,按键与FIFO

前言1.之前做按键,在中断判断并进入回调函数,但是经常会导致其他任务来不及处理,或者是按键触发了但没有执行回调,即用户操作时感觉按键失灵。2.这里更新了一下代码,思路是这样的:中断进入按键扫描,有消抖,不阻塞,如果按键事件触发时即入列,然后操作系统每隔10ms进行一次轮询,若队列不为空,则出列并执行按键回调。有纰漏请指

AI AIgents时代-(四.)应用上手

HuggingGPT&MetaGPT.🟢HuggingGPTHuggingGPT是一个多模型调用的Agent框架,利用ChatGPT作为任务规划器,根据每个模型的描述来选择HuggingFace平台上可用的模型,最后根据模型的执行结果生成总结性的响应。这个项目目前已在Github上开源,并且有一个非常酷的名字叫做JA

python经典百题之统计字符数

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。方法一:str_input=input("请输入一行字符:")count_letter,count_space,count_digits,count_other=0,0,0,0forcharinstr_input:ifchar.isalpha():

文举论金:黄金原油全面走势分析策略指导。

市场没有绝对,涨跌没有定势,所以,对市场行情的涨跌平衡判断就是你的制胜法宝。欲望!有句意大利谚语:让金钱成为我们忠心耿耿的仆人,否则,它就会成为一个专横跋扈的主人。空头,多头都能赚钱,唯有贪心不能赚。是你掌控欲望还是欲望掌控你?古人云:不积硅步无以至千里,不积小流无以成江海。希望这句话成为我们之间的共勉。自知!人贵自知

乐观锁与悲观锁

概述悲观锁总会假设最坏的情况,乐观锁总会假设最好的情况。悲观锁和乐观锁最终都是为了保证线程的安全,避免在并发场景下的资源竞争问题,但是,相对于乐观锁,悲观锁对性能的影响更大!悲观锁共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其他线程。高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统

Python从入门到放弃系列教程01

Python从入门到放弃系列教程01第一章01初识PythonPython的起源1989年,为了打发圣诞节假期,吉多·范罗苏姆(龟叔)决定开发一个新的解释程序(Python雏形),1991年,第一个Python解释器诞生;之所以选中单词Python(意为大蟒蛇)作为该编程语言的名字,是因为英国20世纪70年代首播的电视

AndroidStudio 安装与配置【安装教程】

1.下载软件进入官网https://developer.android.google.cn/studio,直接点击下载2.阅读并同意协议书直接下滑至最底部如果这里出现了无法访问官方地址:https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.

Laravel框架 - Facade门面

1、官方文档给出的定义“Facades为应用的服务容器提供了一个「静态」接口。Laravel自带了很多Facades,可以访问绝大部分功能。LaravelFacades实际是服务容器中底层类的「静态代理」,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。”如何使用Facades?2、Faca

flutter简单的本地草稿箱功能

需求1:发帖退出时提示是否保存草稿需求2:每条草稿中可以保存多张图片(最多9张)或一条视频及三十来个其它参数需求3:每条草稿都是可以被覆盖的、可以点击删除需求4:草稿页面可以一键清空需求5:草稿随app删除一起没掉看到需求第一时间想到的就是存轻量级SharedPreferences中;行动:将图片转为base64,然后

热文推荐