04-树5 Root of AVL Tree
Posted wgxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04-树5 Root of AVL Tree相关的知识,希望对你有一定的参考价值。
这道题目要求找出AVL树的根节点,重点考查了AVL树的旋转(右单旋、左单旋、右-左双旋和左-右双旋)与插入操作。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct AVLNode *AVLTree; 5 typedef int ElementType; 6 struct AVLNode { 7 ElementType Data; 8 AVLTree Left, Right; 9 int Height; // 树高 10 }; 11 12 int Max(int a, int b); 13 int GetHeight(AVLTree T); 14 AVLTree SingleLeftRotation(AVLTree A); 15 AVLTree SingleRightRotation(AVLTree A); 16 AVLTree DoubleLeftRightRotation(AVLTree A); 17 AVLTree DoubleRightLeftRotation(AVLTree A); 18 AVLTree Insert(AVLTree T, ElementType X); 19 20 int main() 21 { 22 int N, i; 23 ElementType data; 24 AVLTree T; 25 26 scanf("%d", &N); 27 for ( i = 0; i < N; i++ ) { 28 scanf("%d", &data); 29 T = Insert(T, data); 30 } 31 printf("%d", T->Data); 32 33 return 0; 34 } 35 36 AVLTree Insert(AVLTree T, ElementType X) 37 { 38 if ( !T ) { 39 T = (AVLTree)malloc(sizeof(struct AVLNode)); 40 T->Data = X; T->Height = 0; 41 T->Left = T->Right = NULL; 42 } 43 else { 44 if ( X < T->Data ) { 45 // 插入 T 的左子树 46 T->Left = Insert(T->Left, X); 47 // 如果需要 左旋 48 if ( GetHeight(T->Left)-GetHeight(T->Right) == 2 ) 49 if ( X < T->Left->Data ) // 左单旋 50 T = SingleLeftRotation(T); 51 else // 左-右双旋 52 T = DoubleLeftRightRotation(T); 53 } 54 else if ( X > T->Data ) { 55 // 插入 T 的右子树 56 T->Right = Insert(T->Right, X); 57 // 如果需要右旋 58 if ( GetHeight(T->Left)-GetHeight(T->Right) == -2 ) 59 if ( X > T->Right->Data ) // 右单旋 60 T = SingleRightRotation(T); 61 else // 右-左双旋 62 T = DoubleRightLeftRotation(T); 63 } 64 /* else X == T->Data 无须插入 */ 65 } 66 // 更新树的高度 67 T->Height = Max( GetHeight(T->Left), GetHeight(T->Right) ) + 1; 68 69 return T; 70 } 71 72 AVLTree DoubleRightLeftRotation(AVLTree A) 73 { 74 // B 与 C 做 左单旋,C 被返回 75 A->Right = SingleLeftRotation(A->Right); 76 // A 与 C 做 右单旋, C 被返回 77 return SingleRightRotation(A); 78 } 79 80 AVLTree DoubleLeftRightRotation(AVLTree A) 81 { /* 注意:A必须有一个左子结点B,且B必须有一个右子结点C */ 82 /* 将A、B与C做两次单旋,返回新的根结点C */ 83 84 // B 与 C 做 右单旋, C被返回 85 A->Left = SingleRightRotation(A->Left); 86 // A 与 C 做 左单旋, C被返回 87 return SingleLeftRotation(A); 88 } 89 90 AVLTree SingleRightRotation(AVLTree A) 91 { 92 AVLTree B = A->Right; 93 A->Right = B->Left; 94 B->Left = A; 95 A->Height = Max( GetHeight(A->Left), GetHeight(A->Right) ) + 1; 96 B->Height = Max( A->Height, GetHeight(B->Right) ) + 1; 97 98 return B; 99 } 100 101 AVLTree SingleLeftRotation(AVLTree A) 102 { /* 注意:A必须有一个左子结点B */ 103 /* 将A与B做左单旋,更新A与B的高度,返回新的根结点B */ 104 AVLTree B = A->Left; 105 A->Left = B->Right; 106 B->Right = A; 107 A->Height = Max( GetHeight(A->Left), GetHeight(A->Right) ) + 1; 108 B->Height = Max( GetHeight(B->Left), A->Height ) + 1; 109 110 return B; 111 } 112 113 int GetHeight(AVLTree T) 114 { 115 if ( !T ) return 0; 116 return T->Height; 117 } 118 119 int Max(int a, int b) 120 { 121 return ( a > b ? a : b ); 122 }
以上是关于04-树5 Root of AVL Tree的主要内容,如果未能解决你的问题,请参考以下文章