递归求二叉排序树ASL值

数据结构:二叉查找树 BST 平均查找长度 ASL 的计算 平均查找长度 ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数称为平均查找长度。 它的定义是这样的: 其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数。 顺序查找平均查找长度的计算 在顺序查找(Sequence Search)表中,查找方式为从头扫到尾,找到待查找元素即查找成功,若到尾部没有找到,说明查找失败。 所以说,Ci 阅读详情

前几天完成数据结构课程设计,需要求二叉树ASL值,去网上查了查,发现都还要用栈啦,队列啦什么的,极其麻烦。
懒得一个一个修改它们的变量名,就自己写了个递归算法来求。
注意:本算法仅求出查找成功的平均查找长度!
下面步入正题:

先列出我的二叉树结构

typedef struct Node // 结构
{
    string data;
    struct Node *lchild, *rchild;
} * BSTNode, *BSTree;

下面这个函数用来求出总权值(应该是这个名字)
 

int BSTasl(BSTree t, int d)
{
    d++;
    int a = d;
    if (t->lchild)
        d += BSTasl(t->lchild, a);
    if (t->rchild)
        d += BSTasl(t->rchild, a);
    return d;
}

值得一提的是,调用这个函数时,d直接赋值为0即可,因为这时候还没有进入这棵树。定义一个变量a是因为直接使用d的话,假如有左子树,右子树遍历时用的初始值就不再是1了,望注意。

下面这个函数用来求出总节点数

int BSTnodecnt(BSTree T)
{
    int d = 0;
    d = 1 + BSTnodecnt(T->lchild) + BSTnodecnt(T->rchild);
    return d;
}

这个比较水,相信大家都会

现在距离最终的ASL值就只相差一个相除了,需要注意的是,总权值那个函数返回的是整型数据,要是不想让ASL值被截断,就乘个1.0就好啦

代码如下

void BSTaslplus(BSTree T)
{
    if(!T) cout<<"该二叉树不存在\n";
    cout << "该二叉排序树ASL值为:" << BSTasl(T, 0) * 1.0 / BSTnodecnt(T) << endl;
    return;
}

综合一下:

typedef struct Node // 结构
{
    string data;
    struct Node *lchild, *rchild;
} * BSTNode, *BSTree;


int BSTnodecnt(BSTree T)//节点总数
{
    int d = 0;
    d = 1 + BSTnodecnt(T->lchild) + BSTnodecnt(T->rchild);
    return d;
}
int BSTasl(BSTree t, int d)//总权值,注意调用时d赋值为0
{
    d++;
    int a = d;
    if (t->lchild)
        d += BSTasl(t->lchild, a);
    if (t->rchild)
        d += BSTasl(t->rchild, a);
    return d;
}
void BSTaslplus(BSTree T)
{
    if(!T)
        cout<<"该二叉树不存在\n";
    else
        cout << "该二叉排序树ASL值为:" << BSTasl(T, 0) * 1.0 / BSTnodecnt(T) << endl;
    return;
}

如果有什么问题,欢迎指正

2022.6.17 经指正,未考虑二叉树不存在的情况

7.3.1二叉排序树 又叫二叉查找树BST,满足左子树节点值<根节点值<右子树节点值,根节点的值>所有左子树的节点值,右子树的任何一个节点值>根节点值,各个子树又递归满足左子树节点值<根节点值<右子树节点值,进行中序遍历时左根右,则可以得到一个递增序列。 阅读详情

相关推荐

二叉排序树(基本操作)

二叉排序树的基本操作: 1、查找 2、增加 3、删除。 代码展示及结果截图: #include<stdio.h> #include<stdlib.h> /* 二叉排序树 <==> 二叉搜索树 (BST) <==> 二叉查找树 1. 二叉排序树的查找功能 (递归、非递归实现) --> 查找效率很大程度上取决于二叉排序树的高度。 2. 二叉排序树的插入功能 (默认不同元素的值才插入) --> 先查找再插入 ...

weixin_42295110的博客 2140

ASL值的通用计算方法

ASL值的通用计算方法:累加各个元素所需的比较次数后除以元素个数(即等概率成功查找条件下)

MiracleM321的博客 4642

7.【二叉排序树(BST)】定义 +【BST的查找、插入、构造、删除】+ 查找效率分析(ASL)

【二叉排序树(BST)】定义 +【BST的查找、插入、构造、删除】+ 查找效率分析

你说的白是什么白_ 828

关于ASL(平均查找长度)的简单总结

关于ASL的简单总结概述顺序查找中ASL计算折半查找中ASL计算哈希表中ASL计算 概述 ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数称为平均查找长度。 它的定义是这样的: 其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数。 当然,有查找成功,就有查找不成功,即要查找元素不在查找表中。针对不同查找方式的查找成功与不成功

Ang_go的博客 6万+

告别Visual Studio!用MSYS2+GCC+CMake在Windows上打造Linux式C++开发环境(保姆级避坑)

本文详细介绍了如何在Windows上使用MSYS2+GCC+CMake搭建Linux式C++开发环境,替代Visual Studio。从MSYS2的安装配置、MinGW-w64 GCC工具链的部署,到CMake项目的创建与构建,提供了保姆级教程和常见问题解决方案,帮助开发者高效过渡到命令行开发模式。

weixin_30298497的博客 324

移动通信基础(13)TDL、CDL、信道相关性

参考《U型槽无线信道多径传播特性测量与建模方法的研究》、《5G信号源中的信道模拟与仿真研究》衰落衰落理解为信号幅度在时间和频率上的不断波动,是无线信道一个重要的恶化特性。信道幅度恶化的两个主要来源分别是加性噪声和信号衰落,高斯白噪声信道模型就是典型的加性噪声,信号衰落引起的是乘性的信号扰动,与加性噪声从原理上完全不同。信道的频率选择性衰落组为无线信道的重要特征之一,是人们进行无线系统设计考虑的重要因素,决定了导频隔间的大小。...

tybAly的博客 2万+

Hash表的平均查找长度ASL计算方法

Hash表的“查找成功的ASL”和“查找不成功的ASL” 鉴于网络上流传了各种计算方法,有的甚至错误百出。本人感觉此种计算方法比较合理,故采纳之。特著此文,以备查阅,欢迎交流。

小二的茶馆 4万+

研究生课程笔记:软件包在流行病学中的应用(三)——STATA软件

关键词:STATA软件基本操作、STATA对于流行病学研究的实现、STATA对复杂抽样设计样本量计算的实现 一、STATA软件基本操作 这部分网上教程有很多,也可以直接根据stata自带的help功能进行自学,在此只记录课程中提及的功能项。 1. 变量编辑 1.1 赋值:label type(按精度区分) 1) 整型:int(32), short(16), long(32) 2) 实型:flo...

weixin_45463530的博客 2432

查找——平均查找长度

查找有以下查找方式: 顺序表查找 二分查找 索引表查找 二叉排序树查找 哈希表查找 接下来整理一下上面每个方式的平均查找长度顺序表查找ASL如果每个关键字查找概率相同,则ASL = (n+1)/2。 一般都是概率相同。二分查找ASL举例说明:这是一个有序序列(下标和关键字相同): 0 1 2 3 4 初始化:low = 0, high = 4第一次: mid = (0+4

karry_zzj的博客 1万+

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3210

Linux下CUDA 11.8与vllm的完美搭配:从环境配置到避坑指南

本文详细介绍了在Linux系统中为CUDA 11.8环境部署vLLM的完整实战指南。针对cu118与vLLM的版本兼容性核心问题,提供了从Python、PyTorch版本选择,到关键依赖vllm-nccl-cu11的安装避坑,以及环境调优、生产级容器化部署的全面解决方案,帮助开发者高效构建稳定的大模型推理服务。

weixin_29095049的博客 308

ASL和二叉排序树

对照着生成树的图,如果查找元素比7还要小,则肯定查找失败,对应着结点7的左孩子位置为null,对比到结点7的左孩子位置,需要进行3次比较才能确认查找元素不存在(和29比,和13比,和7比,再下找没了,所以是3次比较),同一层中,空的还有16的左孩子结点(代表着大于13小于16的数据也是不存在,但是也要比较三次才能确认),32的左孩子结点(大于29小于32的数据),41的左孩子结点(大于37小于41的数据);查找第n个数据长度n。数据:7,10,13,16,19,29,32,33,37,41,43。

whiteBearClimb的博客 5625

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2931

第2关:二叉排序树的定义及查找

头歌上的答案

xiyunSacire的博客 999

linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章:linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)。只是其功能稍稍复杂些,配置也多些,下面一起来看一下。 TP包括 触摸屏、虚拟按键、虚拟按键背光灯 TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synapt

Radia的专栏 4766

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5582

数据结构实验之查找一:二叉排序树

数据结构实验之查找一:二叉排序树 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description对应给定的一个序列可以唯一确定一棵二叉排序树。然而,一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果。你的任务书对于输入的

qq_38388887的博客 238

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

help,二叉排序树ASL成功计算有误

下面这段代码ASL成功编译出来是2.3,但是正确答案应该是3,怎么修改啊,有无大佬help一下。

weixin_74171682的博客 586

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

第27关:基于二叉排序树进行查找并计算ASL

while (getline(ss, key, ' ')) { // 根据空格来分割。// 移除多余的字符。// 商店在顺序表中的下标。#define MAX_SHOP 850 // 最大商家数量。// 读取文件,将商家信息插入顺序表shop_list中。

qq_65852883的博客 462

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

课程设计题7-基于二叉排序树的查找

二叉排序树首先是二叉树,该二叉树不存在重复的结点,对于任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值,即左孩子<父亲<右孩子,如下图。Herb H;//文件读取。。。。。。。。//读取结束// 读取文件,调用InsertBST函数将每个中药材数据插入二叉排序树//c_str转c风格字符串,用于该类型的文件调用if (!cout << "文件打开失败" << endl;exit(0);int i = 0;while (!

LeoJ233的博客 879

二叉树(四)——二叉排序树

二叉排序树是我们经常使用的一种数据结构,它的每一颗子树的根节点永远大于左子树,永远小于右子树。本文介绍了二叉排序树的如下内容: 1、定义; 2、二叉排序树的建立算法和实现; 3、二叉排序树的删除算法; 4、二叉排序树的查找算法和实现; 5、平均查找长度ASL的定义和计算方法。

大前端程序员的自我修养 3763

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

二叉排序树(Binary Search Tree,BST)是一种特殊的二叉树,它满足以下条件:若左子树不为空,则左子树上所有节点的值(权值)均小于它的根节点的值;若右子树不为空,则右子树上所有节点的值(权值)均大于它的根节点的值;左、右子树本身也分别为二叉排序树。二叉排序树的结构可以在查找、插入、删除操作中发挥重要作用,具有快速查找、插入、删除的特点。

icbbm的博客 768

二叉排序树(BST)

二叉排序树的定义 查找操作 插入操作 删除操作 查找效率分析——平均查找长度ASL 平衡二叉树(二叉排序树的引申概念) 二叉排序树的定义 二叉排序树,又称二叉查找树(BST,Binary Search Tree) 一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树: 1、左子树上所有结点的关键字均小于根结点的关键字; 2、右子树上所有结点的关键字均大于根结点的关键字。 左子树与右子树各是一棵二叉排序树。 左子树结点值<根结点值<右子树结点值 如果对二叉排序树进行中序

荒唐的博客 6596

二叉排序树的基本操作以及应用

二叉排序树的建立对于查找和删除的实现更加容易实现,它的速度更快,因而它对数据的查找删除十分重要,所以我们应该掌握这种二叉排序树。

crazyme_6的博客 539

数据结构——四十二、二叉排序树(王道408)

本文介绍了二叉排序树(BST)的定义、查找、插入、构造和删除操作。二叉排序树是一种左子树结点值小于根结点值,右子树结点值大于根结点值的特殊二叉树,其中序遍历可得到递增序列。查找操作通过比较关键字值在左右子树中递归搜索。插入操作根据关键字大小决定插入位置。构造BST即不断插入新结点的过程。删除操作需分三种情况处理:删除叶子结点、仅有一棵子树的结点或两棵子树的结点。对于同时有左右子树的结点,可采用直接后继代替法处理。文章通过图示和代码示例详细说明了各操作的实现过程和应用场景。

2301_80201235的博客 1124
上一篇: VS code配置C/C++环境(保姆式教程)
下一篇: 基于线性表或二叉排序树的低频词过滤系统
Chang乐
博客等级 码龄12年 32粉丝 6原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chang乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值