Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct AvlNode;
  5.  
  6. typedef int ElementType;
  7. typedef struct AvlNode * Position;
  8. typedef Position AvlTree;
  9.  
  10. AvlTree makeEmpty(AvlTree T);
  11. Position find(ElementType x, AvlTree T);
  12. Position findMax(AvlTree T);
  13. Position findMin(AvlTree T);
  14. AvlTree insert(ElementType x, AvlTree T);
  15. AvlTree deleteNode(ElementType x, AvlTree T);
  16. ElementType retrieve(Position p);
  17.  
  18. struct AvlNode {
  19. ElementType element;
  20. AvlTree left;
  21. AvlTree right;
  22. int height;
  23. };
  24.  
  25. static int height(Position p) {
  26. if (p == NULL) {
  27. return -1;
  28. } else {
  29. return p->height;
  30. }
  31. }
  32.  
  33. int maxHeight(int a,int b) {
  34. return a>b?a:b;
  35. }
  36.  
  37. AvlTree makeEmpty(AvlTree T) {
  38. if (T != NULL) {
  39. makeEmpty(T->left);
  40. makeEmpty(T->right);
  41. free(T);
  42. }
  43. return NULL;
  44. }
  45.  
  46.  
  47. Position find(ElementType x, AvlTree T) {
  48. if (T == NULL) {
  49. return NULL;
  50. } else {
  51. if (x < T->left->element) {
  52. T->left = find(x,T->left);
  53. } else if (x > T->right->element) {
  54. T->right = find(x,T->right);
  55. } else {
  56. return T;
  57. }
  58. }
  59. }
  60.  
  61.  
  62. Position singleRotateWithLeft(Position k2) {
  63. Position k1 = k2->left;
  64. k2->left = k1->left;
  65. k1->right = k2;
  66. k1->height = maxHeight(height(k1->left),k1->height) + 1;
  67. k2->height = maxHeight(height(k2->left),height(k2->right)) + 1;
  68. return k1;
  69. }
  70.  
  71. Position singleRotateWithRight(Position k1) {
  72. Position k2 = k1->right;
  73. k1->right = k2->left;
  74. k2->left = k1;
  75. k1->height = maxHeight(height(k1->left),height(k1->right)) + 1;
  76. k2->height = maxHeight(height(k2->left),k2->height) + 1;
  77. return k2;
  78. }
  79.  
  80. Position doubleRotateWithLeft(Position k3) {
  81. k3->left = singleRotateWithLeft(k3->left);
  82. return singleRotateWithRight(k3);
  83. }
  84.  
  85. Position doubleRotateWithRight(Position k3) {
  86. k3->right = singleRotateWithRight(k3->right);
  87. return singleRotateWithLeft(k3);
  88. }
  89.  
  90. AvlTree insert(ElementType x, AvlTree T) {
  91. if (T == NULL) {
  92. T = (AvlTree)malloc(sizeof(struct AvlNode));
  93. T->element = x;
  94. T->left = NULL;T->right = NULL;
  95. T->height = 0;
  96. } else if (T->element < x){
  97. T->left = insert(x,T->left);
  98. if (height(T->left) - height(T->right) == 2) {
  99. if (x < T->left->element) {
  100. T = singleRotateWithLeft(T);
  101. } else {
  102. T = doubleRotateWithLeft(T);
  103. }
  104. }
  105. } else if (T->element > x) {
  106. T->right = insert(x,T->right);
  107. if (height(T->left) - height(T->right) == 2) {
  108. if (x>T->right->element) {
  109. T = singleRotateWithRight(T);
  110. } else {
  111. T = doubleRotateWithRight(T);
  112. }
  113. }
  114. }
  115.  
  116. T->height = maxHeight(height(T->left),height(T->right)) + 1;
  117. return T;
  118. }
  119.  
  120. Position findMax(AvlTree T) {
  121. if (T != NULL) {
  122. while (T->right != NULL) {
  123. T = T->right;
  124. }
  125. }
  126. return T;
  127. }
  128. Position findMin(AvlTree T) {
  129. if (T != NULL) {
  130. while (T->left != NULL) {
  131. T = T->left;
  132. }
  133. }
  134.  
  135. return T;
  136. }
  137.  
  138. AvlTree deleteNode(ElementType x, AvlTree T) {
  139. Position Tmp;
  140. if (T == NULL) {
  141. printf("AvlTree is empty...\n");
  142. } else if (x < T->left->element) {
  143. T->left = deleteNode(x,T->left);
  144. } else if (x > T->right->element) {
  145. T->right = deleteNode(x,T->right);
  146. } else if (T->left && T->right) {
  147. Tmp = findMin(T);
  148. T->element = Tmp->element;
  149. T->right = deleteNode(T->element,T->right);
  150. } else {
  151. Tmp = T;
  152. if (T->left == NULL) {
  153. T = T->right;
  154. } else (T->right == NULL) {
  155. T = T->left;
  156. }
  157. free(Tmp);
  158. }
  159. return T;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement