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% ...
随机推荐
- 黄聪:如何开启IIS7以上的“IIS6管理兼容性”
护卫神PHP套件的安装,需要开启“IIS6管理兼容性”, 那么,如何开启IIS7.IIS7.5.IIS8.0的IIS6兼容模式呢? 设置的时候,请参照如下截图:
- Eclipse中Maven+Spring3.2.8+SpringMVC HelloWorld项目
本文适合有一定spring和springmvc基础,并想使用Maven管理项目的人. 源码打包:http://pan.baidu.com/s/1hqurUcs 转载请声明出处(http://www.c ...
- 图片--android 图片占用内存与什么有关
原文链接:http://blog.csdn.net/zjl5211314/article/details/7041813 在开发手机应用的时候,内存是有限的,那使用的时候,就要合理的运用和释放. 那么 ...
- Java多线程之后台线程不执行finally
后台线程不执行finally package wzh.daemon; import java.util.concurrent.TimeUnit; class ADaemon implements Ru ...
- 拥抱高效、拥抱 Bugtags 之来自用户的声音(五)
Bugtags使用心得(创业公司场景篇) ——成都嘿嘿科技有限公司 作者:小花 一.产品定义 关于手机客户端产品(APP)的 bug 提交.监测及管理且具有团队协作性质的系统. 二.使用环境 公司:初 ...
- 在UEFI下安装windows和Ubuntu双系统目前不可行
UEFI是BIOS的升级,未来将取代BIOS,说白了,就是跟BISO差不多的作用.但是目前比较新的主板兼容两种设置就比较坑了,默认是UEFI,UEFI下只能安装win8以上的版本,和linux64位系 ...
- java 、android 知识图谱
java知识图谱: android知识图谱: 照此图练习,神功自成.....
- Ext.Form 自动填写表单内容
前台: 表单必须含有name属性 if (action == 'edit' || action == 'show') { MyForm1.getForm().load({ url: '/data/cu ...
- [kuangbin带你飞]专题十一 网络流
ID Origin Title 34 / 81 Problem A POJ 3436 ACM Computer Factory 92 / 195 Problem B POJ 3 ...
- HttpRequestValidationException (0x80004005) 的三种可能的解决方法
从客户端中检测到有潜在危险的 Request.Form 值 从客户端(txtSupplement="<textarea name="cont...")中检测到有潜在 ...