数据结构之---C语言实现平衡二叉树(AVL树)
来源:互联网 发布:thinkpad安装软件 编辑:程序博客网 时间:2024/06/05 22:39
//AVL(自动平衡二叉树)#include <stdio.h>#include <stdlib.h>typedef int ElemType;//每个结点的平均值typedef enum{ EH = 0, LH = 1, RH = -1 }bh_t;typedef enum{ FALSE = 0, TRUE = 1}bool_t;//定义平衡二叉树typedef struct BSTNode{ ElemType key; //平衡值 int bf; struct BSTNode *lchild,*rchild; }BSTNode, *BSTree;//中序遍历void InOrderTraverse(BSTree root){ if(NULL != root) { InOrderTraverse(root->lchild); printf("%d\t",root->key); InOrderTraverse(root->rchild); }}//前序遍历void PreOrderTraverse(BSTree root){ if(NULL != root) { printf("%d\t",root->key); PreOrderTraverse(root->lchild); PreOrderTraverse(root->rchild); }}//单向右旋转void R_Rotate(BSTree *p){ BSTree lc=(*p)->lchild; (*p)->lchild=lc->rchild; lc->rchild=*p; *p=lc;}//单向左旋转void L_Rotate(BSTree *p){ BSTree rc=(*p)->rchild; (*p)->rchild=rc->lchild; rc->lchild=*p; *p=rc;}//先左旋后右旋平衡旋转void LeftBalance(BSTree *T){ BSTree lc=(*T)->lchild; BSTree rd = lc->rchild; //判断进行向哪边旋转 switch(lc->bf) { case LH: (*T)->bf=lc->bf=EH; R_Rotate(T); break; case RH: switch(rd->bf) { case LH: (*T)->bf=RH; lc->bf=EH; break; case EH: (*T)->bf=lc->bf=EH; break; case RH: (*T)->bf=EH; lc->bf=LH; break; } rd->bf=EH; L_Rotate(&((*T)->lchild)); R_Rotate(T); break; }}//先右旋后左旋平衡旋转void RightBalance(BSTree *T){ BSTree rc=(*T)->rchild; BSTree ld=rc->lchild; switch(rc->bf) { case RH: (*T)->bf=rc->bf=EH; L_Rotate(T); break; case LH: switch(ld->bf) { case RH: (*T)->bf=LH; rc->bf=EH; break; case EH: (*T)->bf=rc->bf=EH; break; case LH: (*T)->bf=EH; rc->bf=RH; break; } ld->bf=EH; R_Rotate(&((*T)->rchild)); L_Rotate(T); break; }}//插入元素bool_t InsertAVL(BSTree *t,ElemType e,bool_t *taller){ if(NULL == t) return FALSE; if(NULL == *t) { *t=(BSTree)malloc(sizeof(BSTNode)); if(NULL == *t) return FALSE; (*t)->key=e; (*t)->lchild=(*t)->rchild=NULL; (*t)->bf=EH; *taller=TRUE; } else { if(e==(*t)->key) { *taller=FALSE; return FALSE; } if(e<(*t)->key) { if(FALSE == InsertAVL(&((*t)->lchild),e,taller)) return FALSE; if(*taller) { switch((*t)->bf) { case LH: LeftBalance(t); *taller=FALSE; break; case EH: (*t)->bf=LH; *taller=TRUE; break; case RH: (*t)->bf=EH; *taller=FALSE; break; } } } else { if(FALSE == InsertAVL(&((*t)->rchild),e,taller)) return FALSE; if(*taller) { switch((*t)->bf) { case RH: RightBalance(t); *taller=FALSE; break; case EH: (*t)->bf=RH; *taller=TRUE; break; case LH: (*t)->bf=EH; *taller=FALSE; break; } } } } return TRUE;}BSTree searchAVL(BSTree t,ElemType key){ BSTree p=t; while(p) { if(p->key==key) return p; else if(p->key<key) p=p->rchild; else p=p->lchild; } return p;}static void destroy(BSTree *t){ if(NULL != *t) { destroy(&((*t)->lchild)); destroy(&((*t)->rchild)); free(*t); *t = NULL; } return;}void destroyAVL(BSTree root){ if(NULL != root) { destroy(&root); } return;}int main(){ BSTree root=NULL,r; bool_t taller=FALSE; int array[]={13,24,37,90,53}; int i = 0; for(i=0; i < 5; i++) InsertAVL(&root,array[i],&taller); printf("中序遍历:\n"); InOrderTraverse(root); printf("\n先序遍历\n"); PreOrderTraverse(root); printf("\n搜索:37\n"); r=searchAVL(root,37); if(r) { printf("%d\n",r->key); } else { printf("not find!\n"); } destroyAVL(root); root = NULL; return 0;}
结果:
0 0
- 数据结构之 AVL树(平衡二叉树)(C语言实现)
- 数据结构之---C语言实现平衡二叉树(AVL树)
- C语言实现AVL-平衡二叉树
- AVL平衡二叉查找树实现(C语言版本)
- 二叉平衡树(AVL)-C语言
- 【数据结构】平衡二叉树之AVL树
- C语言:平衡二叉树的实现(AVL)
- 数据结构之平衡二叉树AVL
- 平衡二叉树(AVL树) ----- C语言
- 【修改】C实现平衡二叉树---AVL
- 数据结构:AVL树(平衡二叉树)
- 数据结构:平衡二叉树(AVL树)
- 数据结构-平衡二叉树(AVL Tree)
- 数据结构 - 平衡二叉树 AVL
- 数据结构-AVL二叉平衡树
- 数据结构之 AVL平衡树 (c++)
- AVL树(平衡二叉树)的C语言实现及原理
- 平衡二叉树(AVL)的实现,附可运行C语言代码
- HDOJ 题目3397 Sequence operation(线段树区间覆盖异或合并)
- HDU 1712 ACboy needs your help(泛化物品dp)
- Java编程:Beanutils-No destination bean specified问题分析
- MySQL 取得两个时间相差的分钟数 及 常用时间函数
- C#StringBuilder的使用
- 数据结构之---C语言实现平衡二叉树(AVL树)
- tunnel(GRE隧道)+VPN配置过程分析
- 黑马程序员-C语言基础-余数的妙用
- Android开发中颜色的自定义方法
- Android 几种发送短信的方法
- js的局部变量和全局变量的定义形式举例
- C++成员函数的 重载、隐藏、覆盖分析
- 8-Advice for Applying Machine Learing
- OpenCV 对图像进行掩码操作