前几天完成数据结构课程设计,需要求二叉树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";elsecout << "该二叉排序树ASL值为:" << BSTasl(T, 0) * 1.0 / BSTnodecnt(T) << endl;return;
}

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

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

递归求二叉排序树ASL值相关推荐

  1. 非递归遍历求二叉排序树的深度

    一.代码 #include <iostream> #include <stdlib.h> #include <stdio.h> #include <queue ...

  2. 蓝桥杯-递归求二项式系数值(java)

    算法训练 6-1 递归求二项式系数值 时间限制:10.0s 内存限制:256.0MB问题描述样例输入一个满足题目要求的输入范例.3 10样例输出与上面的样例输入对应的输出.数据规模和约定输入数据中每一 ...

  3. 递归求最值(分治递归)

    输入n,再输入n个数,输出n个数中的最小值和最大值. 分治与递归! 代码: #include<iostream>using namespace std; void minmax(int * ...

  4. 使用for及递归求 1-100的和

    package Way_chongzai; //使用for及递归求 1-100的和 public class Test_14 { public static void main(String[] ar ...

  5. python递归求5!_用Python解数独[6]:递归获得最终答案

    import copy import time # 求每一行单元格行值域 def valueRange(row): temp = copy.deepcopy(row) row_value_range ...

  6. 算法训练 6-1 递归求二项式系数值

    算法训练 6-1 递归求二项式系数值   问题描述 样例输入 一个满足题目要求的输入范例. 3 10 样例输出 与上面的样例输入对应的输出. 数据规模和约定 输入数据中每一个数的范围. 例:结果在in ...

  7. C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

    C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈 分享到: QQ空间 新浪微博 腾讯微博 豆瓣 人人网 递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特 ...

  8. python递归求13的n次方_Python题目:递归的简单题目,求阶乘,求n-m的累积和,求斐波那契...

    递归 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事!故事是什么呢?从前有座山,山里有座庙- 定义:递归函数是自身直接或者间接调用自身并且有终止条件的函数 特点:将大问题分解成n个小问题, ...

  9. 习题2.6 递归求简单交错幂级数的部分和 (15 分)

    习题2.6 递归求简单交错幂级数的部分和 (15 分) 本题要求实现一个函数,计算下列简单交错幂级数的部分和: f(x,n)=x−x​2​​+x​3​​−x​4​​+⋯+(−1)​n−1​​x​n​​ ...

最新文章

  1. 柳叶刀发布陈薇团队新冠疫苗试验结果:安全,能诱导免疫反应
  2. platform_device与platform_driver
  3. 全新出击!《Java开发手册(嵩山版)》解读手册升级下载
  4. 茶苑机器人怎么看出来_小儿脑瘫怎么看出来?出现4个异常,该早点去看医生...
  5. UC浏览器PC版新版有什么特点
  6. poj 2653 Pick-up sticks(判断线段相交)
  7. 【BZOJ4196】【codevs4621】软件包管理器,树链剖分练习
  8. linux日志删除1天前,Linux自动删除n天前日志
  9. java main 静态代码_java中没有main方法怎么怎么执行静态块中的内容
  10. Linux的sleep()和usleep()的使用和区别
  11. JavaScript基础用法
  12. java 时间 转化成数字_将时间转化为数字 java
  13. ubantu下安装redis
  14. csdn上面文章转发
  15. 推荐几个全网最全的程序员接私活地方法或完整攻略或常用平台以及接单的注意事项(以免被雇主坑),比如国内的程序员客栈、CODING 码市,国外的Upwork、Freelancer、Dribbble等。
  16. 华为在HDC2021发布全新HMS Core 6 宣布跨OS能力开放
  17. java合并单元格边框不完整,java poi 合并单元格后边框问题
  18. Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序
  19. Linux系统中的kill -0有什么作用?
  20. git报错Successfully created project ‘*****’ on Gitee, but initial commit failed解决

热门文章

  1. 2272: 又是01串(http://acm.zzuli.edu.cn/problem.php?id=2272csrf=nr0h1HsiO5WDrN3Jk1j9aUmgYOdn7QAV)
  2. 钉钉支持鸿蒙系统,钉钉鸿蒙版app
  3. python 带声音屏幕录制
  4. 第十九章 python 数据可视化 Matplotlib Pygal
  5. MoE 系列(一)|如何使用 Golang 扩展 Envoy
  6. 锐捷网络:引领地铁移动互联网快捷交付2.0时代到来
  7. 水果食用大全 -- 果品食疗 - 香蕉
  8. 单线程读单线程写一个变量是否一定要加锁
  9. Google支付 常见错误
  10. 简化m文件转化为c/c++文件,VC编译