前几天完成数据结构课程设计,需要求二叉树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 经指正,未考虑二叉树不存在的情况
2140



被折叠的 条评论
为什么被折叠?



