一步两步学算法之AVLTree

AVLTree也就是所谓的平衡二叉树

定义是  任一节点的左右子树高度差不超过1

给高度差一个名字就是 平衡因子

当平衡因子为2的时候 认为这棵树被破坏

若破坏这个树的节点(也就是插入节点)在被破坏节点(也就是平衡因子为2的节点)的右子树的右子树  则进行左旋  称为RR旋转

若在右子树的左子树  则进行双旋转  先进行右旋转 再进行左旋转 称为RL旋转

若在左子树的左子树  则进行右旋转  称为LL旋转

若在左子树的右子树 则也进行双旋转 先左旋 再右旋  也称LR旋转

代码如下

 1 typedef struct AVLTreeNode *AVLTree;

 2 

 3 typedef struct AVLTreeNode{

 4     ElementType Data;

 5     AVLTree Left;

 6     AVLTree Right;

 7     int Height;

 8 }

 9 

10 AVLTree AVL_Insertion(ElementType x,AVLTree t)

11 {

12     if(!t)     //空树插入 

13     {

14         t=(AVLTree)malloc(sizeof(struct AVLTreeNode));

15         t->Data=x;

16         t->Height=0;

17         t->Left=t->Right=NULL;

18     }

19     else if(x<t->Data)                 

20     {

21         t->left=AVL_Insertion(x,t->left);    //若x比data小,则插到左子树

22         if(GetHeight(t->Left)-GetHeight(t->Right)==2)        //若平衡因子为2,则这个节点的平衡被破坏 

23             if(x<t->Left->Data)                                //破坏者在左子树的左子树  则右旋转 

24                 t=SingleRightRotation(t);

25             else

26                 t=DoubleLeftRightRotation(t);                //在左子树的右子树 则进行LR旋转 先左旋再右旋 

27     }

28     else if(x>t->Data)

29     {

30         t->Right=AVL_Insertion(x,t->Right);

31         if(GetHeight(t->left)-GetHeight(t->right)==-2)            

32             if(x>t->Right->Data)

33                 t=SingleLeftRotation(t);                    //在右子树的右子树 进行左旋 

34             else

35                 t=DoubleRightLeftRotation(T);                //右子树的左子树 进行RL旋转 

36                 

37     }

38     t->Height=Max(GetHeight(t->Left),GetHeight(t->Right))+1;  //更新高度 

39     

40     return t;

41 }

42 

43 AVLTree SingleRightRotation(AVLTree A)

44 {

45     AVLTree B=A->Left;                    //a的左子树给B                    

46     A->Left=B->Right;                    //把b的右子树放到a的左边 

47     B->Right=A;                            //a放到b的右边 

48     A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;

49     B->Height=Max(GetHeight(B->Left),A->Height)+1;

50     return B;

51 }

52 

53 AVLTree DoubleLeftRightRotation(AVLTree A)

54 {

55     A->Left=SingleLeftRotation(A=->Left);

56     

57     return SingleRightRotation(A);

58 }

 

你可能感兴趣的:(tree)