04-树5- Root of AVL Tree
来源:互联网 发布:淘宝1分钱抢购在哪 编辑:程序博客网 时间:2024/05/21 08:43
An AVL tree is a self-balancing binary search tree,In an AVL tree,the heights of the two child subtrees of any node differ by at most one;If at any time they differ by more than one,rebalancing is done to restore this property.Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions,you are supposed to tell the root resulting AVL tree.
Input Specification
Each input file contains one test case,for each case the first line a positive integer N (<=20) which is the total number of keys to be inserted.Then N distinct integer keys are given in the next line.All the numbers in a line are separated by a space.
Output Specification
For each test case,print the root of the resulting AVL tree in one line.
#include<stdio.h>#include<stdlib.h>#define ElementType inttypedef struct AVLNode *Position;typedef Position AVLTree;typedef struct AVLNode{ ElementType Data; AVLTree Left; AVLTree Right; int Height;};int Max(int a,int b){ return a>b?a:b;}int GetHeight(AVLTree T){ if(!T) return 0; else return T->Height;}AVLTree SingleLeftRotation ( AVLTree A ){ AVLTree B = A->Left; A->Left = B->Right; B->Right = A; A->Height = Max( GetHeight(A->Left), GetHeight(A->Right) ) + 1; B->Height = Max( GetHeight(B->Left), A->Height ) + 1; return B;}AVLTree SingleRightRotation(AVLTree A){ AVLTree B = A->Right; A->Right = B->Left; B->Left = A; A->Height = Max(GetHeight(A->Left),GetHeight(A->Right)) + 1; B->Height = Max(GetHeight(B->Left),A->Height) + 1; return B;}AVLTree DoubleLeftRightRotation ( AVLTree A ){ A->Left = SingleRightRotation(A->Left); return SingleLeftRotation(A); }AVLTree DoubleRightLeftRotation(AVLTree A){ A->Right = SingleLeftRotation(A->Right); return SingleRightRotation(A); }AVLTree Insert( AVLTree T, ElementType X ){ /* 将X插入AVL树T中,并且返回调整后的AVL树 */ if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */ T = (AVLTree)malloc(sizeof(struct AVLNode)); T->Data = X; T->Height = 0; T->Left = T->Right = NULL; } /* if (插入空树) 结束 */ else if ( X < T->Data ) { /* 插入T的左子树 */ T->Left = Insert( T->Left, X); /* 如果需要左旋 */ if ( GetHeight(T->Left)-GetHeight(T->Right) == 2 ) if ( X < T->Left->Data ) T = SingleLeftRotation(T); /* 左单旋 */ else T = DoubleLeftRightRotation(T); /* 左-右双旋 */ } /* else if (插入左子树) 结束 */ else if ( X > T->Data ) { /* 插入T的右子树 */ T->Right = Insert( T->Right, X ); /* 如果需要右旋 */ if ( GetHeight(T->Left)-GetHeight(T->Right) == -2 ) if ( X > T->Right->Data ) T = SingleRightRotation(T); /* 右单旋 */ else T = DoubleRightLeftRotation(T); /* 右-左双旋 */ } /* else if (插入右子树) 结束 */ /* else X == T->Data,无须插入 */ /* 别忘了更新树高 */ T->Height = Max( GetHeight(T->Left), GetHeight(T->Right) ) + 1; return T;}int main(){ int N,key; AVLTree tree = NULL; scanf("%d",&N); for(int i=0;i<N;i++) { scanf("%d",&key); tree = Insert(tree,key); } printf("%d",tree->Data); return 0;}
- 04-树5 Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树5- Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树5 Root of AVL Tree
- 04-树4. Root of AVL Tree
- 04-树3. Root of AVL Tree
- 04-树3. Root of AVL Tree
- 04-树5 Root of AVL Tree (25分)
- 04-树5 Root of AVL Tree (25分)
- 04-树5 Root of AVL Tree (25分)
- 04-树5 Root of AVL Tree (25分)
- 04-树5 Root of AVL Tree (25分)
- 04-树5 Root of AVL Tree
- 南大软院大神养成计划--day01
- PCB设计后期CHECKLIST
- NSArray集合的方法概览
- CSS制作水平垂直居中对齐
- Android Spinner选择同一个选项时触发onItemSelected事件
- 04-树5- Root of AVL Tree
- Linux内核模块编程-系统调用拦截
- 欢迎使用CSDN-markdown编辑器
- Spring4整合Hibernate4详细示例
- [TwistedFate]UISegmentedControl
- linux 压缩解压缩命令
- Webkit之RenderLayer创建的场景
- nexus安装
- Boosting分类器