Avl树的基本操作(c语言实现)
#include<stdio.h>
#include<stdlib.h>
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
typedef int ElementType;
struct AvlNode{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
}AvlNode;
//Avl函数的声明
AvlTree CreateTree(); //创建Avl树
Position Find(ElementType Element, AvlTree T); //查找
Position FindMax(AvlTree T);
Position FindMin(AvlTree T);
AvlTree Insert(ElementType Element, AvlTree T); //插入
AvlTree Delete(ElementType Element, AvlTree T); //删除
//插入结点到AVL树所需的函数声明
int Height(AvlTree T); //返回树的高
int Max(ElementType A, ElementType B); //比较树高
Position SingleRotateWithLeft(Position K2); //左单旋
Position SingleRotateWithRight(Position K2); //右单旋
Position DoubleRotateWithLeft(Position K3); //左右双旋
Position DoubleRotateWithRight(Position K3); //右左双旋
void PreOrder_1(AvlTree T); //先序遍历(递归)
int main()
{
AvlTree T;
ElementType Element;
, i;
printf(" 本程序实现Avl树的基本操作。 \n");
printf("| |\n");
printf("|**********************************************************************|\n");
printf("| Avl树的基本操作如下: |\n");
printf("| 0.创建Avl树 |\n");
printf("| 1.查找 |\n");
printf("| 2.插入 |\n");
printf("| 3.删除 |\n");
printf("| 4.将Avl树遍历 |\n");
printf("|**********************************************************************|\n");
while(flag){
printf("| 请选择功能: |\n");
scanf("%d", &i);
//输入需要选择的功能
switch(i){
:
printf("请输入Avl树的根结点(0代表NULL):");
T = CreateTree();
break;
:
if(T){
printf("请输入要查找的元素:");
scanf("%d", &Element);
if( Find(Element, T))
printf("该元素存在!\n");
else
printf("该元素不存在!\n");
}else
printf(" Avl树为空!\n");
break;
:
if(T){
printf("请输入要插入的元素:");
scanf("%d", &Element);
T = Insert(Element, T);
}else
printf(" Avl树为空!\n");
break;
:
if(T){
printf("请输入要删除的元素:");
scanf("%d", &Element);
T = Delete(Element, T);
}else
printf(" Avl树为空!\n");
break;
:
if(T){
printf("(先序)遍历的结果为:");
PreOrder_1(T);
printf("\n");
}else
printf(" Avl树为空!\n");
break;
default:
flag = ;
printf("程序运行结束,按任意键退出!\n");
}
}
;
}
//Avl树的函数
AvlTree CreateTree() //创建Avl树
{
ElementType ch;
AvlTree T;
scanf("\n%d", &ch);
)
T = NULL;
else{
if(!(T = (AvlTree)malloc(sizeof(AvlNode))))
exit(-);
T->Element = ch;
printf("%d的左儿子为:", T->Element );
T->Left = CreateTree();
printf("%d的右儿子为:", T->Element );
T->Right = CreateTree();
}
return T;
}
Position Find(ElementType Element, AvlTree T) //Avl树的查找
{
if(T == NULL)
return NULL;
if(Element < T->Element) //向左找
return Find(Element, T->Left);
else if(Element > T->Element) //向右找
return Find(Element, T->Right);
else
return T;
}
Position FindMax(AvlTree T) //找最大值(非递归)
{
if(T != NULL){
while(T->Right != NULL ) //一直向右找
T = T->Right;
}
return T;
}
// Position FindMax(AvlTree T) //找最大值(递归)
//{
// if(T == NULL)
// return NULL;
// else if(T->Right == NULL)
// return T;
// else
// return FindMax(T->Right);
// }
Position FindMin(AvlTree T) //找最小值(非递归)
{
if(T != NULL){ //一直向左找
while(T->Left != NULL )
T = T->Left;
}
return T;
}
// Position FindMin(AvlTree T) //找最小值(递归)
//{
// if(T == NULL)
// return NULL;
// else if(T->Left == NULL)
// return T;
// else
// return FindMax(T->Left);
// }
AvlTree Insert(ElementType Element, AvlTree T) //插入元素到AVL树中
{
if(T == NULL){ //如果是空树,则初始化之
if(!(T = (AvlTree)malloc(sizeof(AvlNode))))
exit(-);
else{
T->Element = Element;
T->Height = ;
T->Left = T->Right = NULL;
}
}else if(Element < T->Element ){ //向左找
T->Left = Insert(Element, T->Left);
) //破坏了Avl树的平衡
if(Element < T->Left->Element )
T = SingleRotateWithLeft(T); //左 单旋(可以理解为此时树向左下沉(即天平偏向左边,需要向右挪树))
else
T = DoubleRotateWithLeft(T); //左右双旋 (先执行右单旋,再执行左单旋,一共旋转2次)
}else if(Element > T->Element ){
T->Right = Insert(Element, T->Right);
)
if(Element > T->Right->Element )
T = SingleRotateWithRight(T); //右单旋
else
T = DoubleRotateWithRight(T); //右左双旋
}
T->Height = Max(Height(T->Left ), Height(T->Right )) + ; //平衡后新树的高度
return T;
}
AvlTree Delete(ElementType Element, AvlTree T) //删除元素 (与搜索二叉树的删除类似)
{
Position TmpCell;
if(T == NULL) //空树
printf("没找到该元素,无法删除!\n");
else if(Element < T->Element)
T->Left = Delete(Element, T->Left);
else if(Element > T->Element)
T->Right = Delete(Element, T->Right);
else if(T->Left && T->Right){ //要删除的树左右都有儿子
TmpCell = FindMin(T->Right); //用该结点右儿子上最小结点替换该结点,然后与只有一个儿子的操作方法相同
T->Element = TmpCell->Element;
T->Right = Delete(T->Element, T->Right);
}else{
TmpCell = T; //要删除的结点只有一个儿子
if(T->Left == NULL)
T = T->Right;
else if(T->Right == NULL)
T = T->Left;
free(TmpCell);
}
return T;
}
void PreOrder_1(AvlTree T) //先序遍历(递归)
{
if(T){
printf("%d ", T->Element);
PreOrder_1(T->Left);
PreOrder_1(T->Right);
}
}
int Height(AvlTree T) //返回的高
{
if(T == NULL)
;
else
+ Max(Height(T->Left ), Height(T->Right ));
}
int Max(ElementType A, ElementType B) //比较树高
{
if(A > B)
return A;
else
return B;
}
Position SingleRotateWithLeft(Position K2) //左单旋
{
Position K1;
K1 = K2->Left ;
K2->Left = K1->Right ;
K1->Right = K2;
K2->Height = Max(Height(K2->Left ), Height(K2->Right )) + ;
K1->Height = Max(Height(K1->Left ), Height(K1->Right )) + ;
return K1;
}
Position SingleRotateWithRight(Position K2) //右单旋
{
Position K1;
K1 = K2->Right ;
K2->Right = K1->Left ;
K1->Left = K2;
K2->Height = Max(Height(K2->Left ), Height(K2->Right )) + ;
K1->Height = Max(Height(K1->Left ), Height(K1->Right )) + ;
return K1;
}
Position DoubleRotateWithLeft(Position K3) //左右双旋
{
K3->Left = SingleRotateWithRight(K3->Left );
return SingleRotateWithLeft(K3);
}
Position DoubleRotateWithRight(Position K3) //右左双旋
{
K3->Right = SingleRotateWithLeft(K3->Right );
return SingleRotateWithRight(K3);
}
Avl树的基本操作(c语言实现)的更多相关文章
- AVL树的创建--C语言实现
AVL树是一种自平衡(Self-balancing)二叉查找树(Binary Search Tree),要求任何一个节点的左子树和右子树的高度之差不能超过1. AVL树的插入操作首先会按照普通二叉查找 ...
- AVL树(三)之 Java的实现
概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...
- AVL树(二)之 C++的实现
概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍2. AVL树的C++实现3. AVL树的C++测试程序 转载请注明出处:ht ...
- AVL树的左旋右旋理解 (转)
AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...
- 图解数据结构树之AVL树
AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节点的两个子 ...
- AVL树之 Java的实现
AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...
- AVL树的理解及自写AVL树
AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...
- AVL树的实现——c++
一.概念 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它 ...
- linux 内核数据结构之 avl树.
转载: http://blog.csdn.net/programmingring/article/details/37969745 https://zh.wikipedia.org/wiki/AVL% ...
随机推荐
- 黄聪:VPS实现自动定时备份网站数据以及Mysql数据库到百度云同步盘
建站多了,备份成了头疼的问题,因为你不知道你的VPS什么时候会宕机或者服务商跑路,一旦网站数据丢失,那么相当于前功尽弃了,所以自己研究出了一套自动备份的方法. 需要的东西: 1.一个VPS(虚拟空间没 ...
- memcached应用场景(转)
memcached最吸引人的地方主要在于它的分布式.分布式对于互联网应用来讲,按照用途基本上可划分为三种方式:分布式计算.分布式存储和两者兼而有之.memcached是分布式存储的一种.我们常见的分 ...
- Elastic Search(一)
一. 安装插件 Marvel集群管理 root@lj-ThinkPad-L460:~# sudo bin/plugin install license root@lj-ThinkPad-L460:~# ...
- Hibernate中get和load的区别
get获取的对象立即执行sql查询数据库中当前实体表中的数据,如果外键关联的其他实体表如果配置了懒加载关闭,则也会查询出外键关联的其他实体表中的数据,否则外键关联的其他实体表则以代理对象表示(称其为代 ...
- WLS_Oracle Weblogic管理概述(概念)
2012-09-01 Created By BaoXinjian
- BEvent_客制化BusinessEvent通过Workflow Event接受消息传递(案例)
2014-08-03 Created By BaoXinjian
- python实现字体闪图
!/usr/bin/env python from future import print_function import os.path import sys from optparse impor ...
- memcache 内部原理实现
Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...
- vs2012出现无法启动iis express web 服务器的错误
一直用的好好的,今天调试时却总报上面的错误.“文件查看器”->"windows 日志"->"系统"里发现有几条“HttpEvent”错误, 具体信息 ...
- cotex_m3内核提供的ITM串口打印调试
cotex_m3内核的ARM提供了ITM串口打印观测的功能,可以不用ARM单片机自己的串口就可在开发时候串口打印调试.节约了宝贵的内部资源,同时也为调试提供了方便.使用方法如下: 1 将下面的SWO_ ...