二叉排序树和平衡二叉树的实现与比较
创作时间:
作者:
@小白创作中心
二叉排序树和平衡二叉树的实现与比较
引用
CSDN
1.
https://m.blog.csdn.net/2301_80057101/article/details/143782696
二叉排序树(BST树)的任何结点均满足:“若左子树存在,根结点大于其左子树上的所有结点;若右子树存,根结点小于其右子树上的所有结点。给定一个数据序列(所有数据互不相等),可以构造二叉排序树。例如:按照下面的数据序列及其先后顺序{ 10,30,20,7,5,6,2,9,28 }可构造出如下的二叉排序树。
平衡二叉树(AVL树)是一种二叉排序树,同时要求每个结点左右子树的高度最多相差为1。对上述数据序列,同样按照数据序列及其先后顺序构造平衡二叉树,可构造出如下的平衡二叉树。
对序列中的数据元素进行查找,对于单个数据而言,平衡二叉树查找成功的比较次数不一定比二叉排序树小,但是,在每个数据元素查找的等概率下,平衡二叉树查找成功的平均查找长度要小于二叉排序树的平均查找长度。使用C或C++编写算法完成:
(1)按给定数据序列及其顺序构建二叉排序树;
(2)按给定数据序列及其顺序构建平衡二叉树;
(3)计算并输出二叉排序树中所有数据元素在查找等概率下的平均查找长度;
(4)计算并输出平衡二叉树中所有数据元素在查找等概率下的平均查找长度。
输入格式:
输入分为2行,第1行为数据元素个数,第2行为数据元素,其中个数据元素为整数。
输出格式:
输出分为2行,第1行为二叉排序树的平均查找长度,第2行为平衡二叉树的平均查找长度。平均查找长度位置输出所有数据元素查找成功的比较次数之和即可。这样输出就是一个整数了。
输入样例:
对于上面的数据序列,输入格式为:
9
10,30,20,7,5,6,2,9,28
输出样例:
对于上面的数据序列,输出格式为:
BST-ASL:26
AVL-ASL:25
其中“BST-ASL:”和“AVL-ASL:”为二叉排序树和平衡二叉树的平均查找长度提示,其后为各自树中所有数据查找成功的比较次数之和。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BSTNode
{
int value;
struct BSTNode *left;
struct BSTNode *right;
} BSTNode;
typedef struct AVLNode
{
int value;
struct AVLNode *left;
struct AVLNode *right;
int height;
} AVLNode;
int height(AVLNode* node)
{
return node == NULL ? 0 : node->height;
}
AVLNode* rightRotate(AVLNode* y)
{
AVLNode* x = y->left;
AVLNode* T2 = x->right;
x->right = y;
y->left = T2;
y->height = 1 + (height(y->left) > height(y->right) ? height(y->left) : height(y->right));
x->height = 1 + (height(x->left) > height(x->right) ? height(x->left) : height(x->right));
return x;
}
AVLNode* leftRotate(AVLNode* x)
{
AVLNode* y = x->right;
AVLNode* T2 = y->left;
y->left = x;
x->right = T2;
x->height = 1 + (height(x->left) > height(x->right) ? height(x->left) : height(x->right));
y->height = 1 + (height(y->left) > height(y->right) ? height(y->left) : height(y->right));
return y;
}
int getBalance(AVLNode* node)
{
return node == NULL ? 0 : height(node->left) - height(node->right);
}
BSTNode* insertBST(BSTNode* root, int value)
{
if (root == NULL)
{
root = (BSTNode*)malloc(sizeof(BSTNode));
root->value = value;
root->left = root->right = NULL;
return root;
}
else
{
if (value < root->value)
{
root->left = insertBST(root->left, value);
}
else
{
root->right = insertBST(root->right, value);
}
return root;
}
}
AVLNode* insertAVL(AVLNode* node, int value)
{
if (node == NULL)
{
node = (AVLNode*)malloc(sizeof(AVLNode));
node->value = value;
node->left = node->right = NULL;
node->height = 1;
return node;
}
else
{
if (value < node->value)
{
node->left = insertAVL(node->left, value);
}
else
{
node->right = insertAVL(node->right, value);
}
node->height = 1 + (height(node->left) > height(node->right) ? height(node->left) : height(node->right));
int balance = getBalance(node);
// 左左进行右旋转
if (balance > 1 && value < node->left->value)
{
return rightRotate(node);
}
// 右右进行左旋转
if (balance < -1 && value > node->right->value)
{
return leftRotate(node);
}
// 左右
if (balance > 1 && value > node->left->value)
{
node->left = leftRotate(node->left); //将左子树向左旋转得到LL
return rightRotate(node); //将得到的LL进行右旋转
}
// 右左
if (balance < -1 && value < node->right->value)
{
node->right = rightRotate(node->right); //将右子树向右旋转得到RR
return leftRotate(node); //将得到的RR进行左旋转
}
return node;
}
}
int BST(BSTNode* root, int value, int* p)
{
(*p)++;
if (root == NULL)
{
return 0;
}
else
{
if (value < root->value)
{
return BST(root->left, value, p);
}
else if (value > root->value)
{
return BST(root->right, value, p);
}
return 1;
}
}
int AVL(AVLNode* root, int value, int* q)
{
(*q)++;
if (root == NULL)
{
return 0;
}
else
{
if (value < root->value)
{
return AVL(root->left, value, q);
}
else if (value > root->value)
{
return AVL(root->right, value, q);
}
return 1;
}
}
int main()
{
int n;
int p = 0, q = 0;
scanf("%d", &n);
int *a = (int*)malloc(n * sizeof(int));
char inputs[100];// 使用字符串输入
scanf("%s", inputs);
int m = 0;
char* token = strtok(inputs, ",");
while (token != NULL && m < n)
{
sscanf(token, "%d", &a[m++]);
token = strtok(NULL, ",");
}
BSTNode* bstRoot = NULL;
AVLNode* avlRoot = NULL;
for (int i = 0; i < n; i++)
{
bstRoot = insertBST(bstRoot, a[i]);
}
for (int i = 0; i < n; i++)
{
avlRoot = insertAVL(avlRoot, a[i]);
}
for (int i = 0; i < n; i++)
{
BST(bstRoot, a[i], &p);
}
for (int i = 0; i < n; i++)
{
AVL(avlRoot, a[i], &q);
}
printf("BST-ASL:%d\n", p);
printf("AVL-ASL:%d", q);
return 0;
}
本文原文来自CSDN
热门推荐
如何注销名下多余的手机卡?
右肩化脓性关节炎护理
企业制度建设中存在的六大问题及解决方案
坚守老手艺 手工挂面香
速看 | 25高考生注意:八省联考具体安排发布,关系明年高考!
AI技术,重塑公共服务新模式
优绩主义为何引发反感?从网红争议看当代社会成功观
每天早上起床脸肿眼肿是怎么回事
从身高猛增到东亚垫底,日本身高暴跌真相,是老美设的局吗?
拆解赣锋锂业年报:业绩大跌之下 28岁“少东家”未来如何掌舵
探秘竹结构:强度与韧性的完美结合
2024年农村养老金上调19.4%,60岁以上的农民,每月领多少钱?
15年农村养老金涨68元,职工养老金涨2090元,为何差距那么大?
雾天行车安全指南:正确使用灯光和驾驶技巧
INFP测试与详解
木多火塞的八字命局(木多火塞的八字命局如何补救)
李成栋:“嘉定三屠”平灭二帝,冲冠一怒之南明“忠烈”宁夏王
毕业生就业困境:找工作难的原因是什么?
养老行业有哪些工作岗位
受益于军事及通信领域需求 我国T/R组件及芯片市场空间大
2024年纪念币收藏市场热点与投资潜力解析
父母在服刑,子女可以当兵吗?
大叶性肺炎的X线影像特征及临床意义
电子天平机械故障的检测步骤及方法
中国超级计算机发展
十八世纪初的波多黎各:西班牙殖民地的科技、文化和历史考察
计算机病毒防治指南:从个人防护到企业级解决方案
圣基茨旅游指南:在圣基茨和尼维斯必做的十五件大事
上海北外滩房价或将突破20万/㎡,新加坡资本大举入市
扫描电镜(SEM)+能谱仪(EDS)设备检测能力详解