AVL树
2015-11-24 20:17
405 查看
AVL树是其每一个节点的左子树和右子树的高度差最多差1的二叉查找树。
///////////Avl树////////////// struct AvlNode; typedef struct AvlNode* AvlTree; typedef struct AvlNode* Position; struct AvlNode{ ElementType element; AvlTree left; AvlTree right; int height; //存储高度信息 } //返回高度信息 int get_height(Position P){ if(P==NULL){ return -1; } else{ return P->height; } } //插入元素到AVL树的例程 重难点 AvlTree Insert(ElementType x,AvlTree T){ if(T==NULL){ AvlTree T=malloc(sizeof(struct AvlNode)); T->element=x; T->left=NULL; T->right=NULL; T->height=0; //return T; } else if(x < T->element){ T->left=Insert(x,T->left); //处理左平衡条件 if((get_height(T->left)-get_height(T->right))==2 /* >1 */){ if(x < T->left->element){ //左左 T=SingleRorateWithLeft(T); } else{ //左右 T=DoubleRotateWithLeft(T); } } } else if(x > T->element){ T->right=Insert(x,T->right); //同理,处理右平衡条件 if((get_height(T->right) - get_height(T->left))==2){ if(x > T->right->element){ //右右 T=SingleRorateWithRight(T); } else{ //右左 T=DoubleRotateWithRight(T); } } } else{ //x is already exists,do nothing } //高度信息修改 T->height=max(get_height(T->left),get_height(T->right))+1; return T; } //单旋转例程 左左 Position SingleRorateWithLeft(Position K2){ //初始化 Position K1; K1=K2->left; //旋转 K2->left=K1->right; K1->right=K2; //更新高度信息 K2->height=max(get_height(K2->left),get_height(K2->right))+1; K1->height=max(get_height(K1->left),get_height(K1->right)/*K2->height*/)+1; //返回新节点 return K1; } //右右 Position SingleRorateWithRight(Position K2){ Position K1; K1=K2->right; K2->right=K1->left; K1->left=K2; K2->height=max(get_height(K2->left),get_height(K2->right))+1; K1->height=max(get_height(K1->left),get_height(K1->right))+1; return K1; } //双旋转例程 左右 Position DoubleRotateWithLeft(Position K3){ K3->left=SingleRorateWithRight(K3->left); return SingleRorateWithLeft(K3); } //双旋转例程 右左 Position DoubleRotateWithRight(Position K3){ K3->right=SingleRorateWithLeft(K3->right); return SingleRorateWithRight(K3); }
相关文章推荐
- UI学习 第四章 UIImage    UIImageView    手势
- 阿里云window服务器检查恶意攻击方法
- 在QListWidgetItem上绘制文字和图片
- SSL构建单双向https认证!https部署及注意事项!
- codeforce #331D Wilbur and Trees (记忆化搜索DP)
- ibatis缓存优化
- 黑马程序员——C语言——数组
- EEG 学习记录
- 【人月神话】第二章:人月神话
- 家庭作业(更新中)
- Android应用启动优化:一种DelayLoad的实现和原理
- PopupWindow
- Java反射机制简介
- Linux.BackDoor.Gates/Chikdos Attack And Defense Analysis
- 我的余弦相似性,基于TFIDF结果
- 日志分析系统
- 如何实现 TreeView Items 全部展开和全部收缩(WPF)
- android 位移、缩放动画
- POJ2387 Til the Cows Come Home(SPFA + dijkstra + BallemFord 模板)
- uva 120 C - Stacks of Flapjacks