二叉排序树和平衡二叉树的实现与比较
创作时间:
作者:
@小白创作中心
二叉排序树和平衡二叉树的实现与比较
引用
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
热门推荐
唐代音乐传奇:李龟年的兴衰与流浪
西安周边自驾游一日游攻略推荐
夏天,少给孩子吃烤肉,要多吃八道菜,低热量高营养,健康长高个
反诈直通车161︱虚拟投资赚大钱?小心500万打水漂!
待处理财产损益余额在贷方的会计处理方法
如何设计一场好的Boss battle? 聊聊Boss战的作用和设计要点
《易经》风泽中孚卦详解:真诚与信任的力量
VLAN间互联技术详解:三种主流实现方案与应用场景
流行性腮腺炎疫苗(注射)
【两汉】盈盈一水间,脉脉不得语
捡到流浪猫后该怎么办?收养流浪猫的完整指南
房贷审核需要提供几个月的银行流水
长期少量吃异维A酸治疗痤疮,会有很大的副作用吗?
如何制作报名系统?从策划到执行一篇文章就够了!(保姆级教程)
美国驾照分类指南
重磅!中国生物制造领域首个国家级产业创新平台在深圳光明区启动建设
香港特殊教育需要(SEN)学生:九大类别及社会支援体系
IMAX影院是什么意思啊(IMAX影院的具体定义与特点)
改革开放创新是深圳奇迹三大动力
信用卡和贷款,傻傻分不清楚?一篇帮你全搞懂!
盲人按摩店老板赵新英:让他们在深圳有尊严地生活
如何应对房屋中介欺诈行为
李嘉诚的财富传承之道,揭秘家族信托的核心功能与优势
动漫中的校园世界:从经典作品到未来趋势
如何处理医疗纠纷投诉
减肥期间生理期出现对甜食的渴望该如何处理
Qt开发授权详解:开源证书(L)GPL使用指南
地域性元素在山水画中的应用——以宁夏固原冶家村为例
孩子能玩游戏吗?儿童游戏时间是否适宜探讨
古代婚姻制度下的三妻四妾现象