fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct AVLNode
  5. {
  6. int data;
  7. struct AVLNode *left;
  8. struct AVLNode *right;
  9. int height;
  10. };
  11.  
  12.  
  13. int max(int a, int b)
  14. {
  15. return (a > b) ? a : b;
  16. }
  17.  
  18. int height(struct AVLNode *node)
  19. {
  20. if (node == NULL)
  21. {
  22. return 0;
  23. }
  24. return node->height;
  25. }
  26.  
  27. int cariBF(struct AVLNode *node)
  28. {
  29. if (node == NULL)
  30. {
  31. return 0;
  32. }
  33. return height(node->left) - height(node->right);
  34. }
  35.  
  36. struct AVLNode *create(int data)
  37. {
  38. struct AVLNode *node = (struct AVLNode *)malloc(sizeof(struct AVLNode));
  39. node->data = data;
  40. node->left = NULL;
  41. node->right = NULL;
  42. node->height = 1;
  43. return node;
  44. }
  45.  
  46. struct AVLNode *rotateRight(struct AVLNode *pivotnode)
  47. {
  48. struct AVLNode *newp = pivotnode->left; // child kiri pivotnode jadi parent baru
  49. struct AVLNode *T = newp ->right;
  50.  
  51.  
  52. pivotnode->left = T; // child kanan new parent jadi child kiri pivot node
  53. newp ->right = pivotnode; // right child newp jadi pivot
  54.  
  55. pivotnode->height = max(height(pivotnode->left), height(pivotnode->right)) + 1; // update height
  56. newp ->height = max(height(newp ->left), height(newp ->right)) + 1;
  57.  
  58. return newp ;
  59. }
  60.  
  61. struct AVLNode *rotateLeft(struct AVLNode *pivotnode)
  62. {
  63. struct AVLNode *newp = pivotnode->right; // right child pivot jadi parent baru
  64. struct AVLNode *T = newp ->left;
  65.  
  66.  
  67. pivotnode->right = T; // right child newp jadi left child pivot
  68. newp->left = pivotnode; // left child newp jadi pivot
  69.  
  70. pivotnode->height = max(height(pivotnode->left), height(pivotnode ->right)) + 1;
  71. newp->height = max(height(newp->left), height(newp->right)) + 1;
  72. return newp;
  73. }
  74.  
  75. struct AVLNode *insert(struct AVLNode *node, int data)
  76. {
  77. if (node == NULL)
  78. {
  79. return create(data);
  80. }
  81. if (data < node->data)
  82. {
  83. node->left = insert(node->left, data);
  84. }
  85. else if (data > node->data)
  86. {
  87. node->right = insert(node->right, data);
  88. }
  89. else
  90. {
  91. return node;
  92. }
  93. node->height = 1 + max(height(node->left), height(node->right));
  94.  
  95. int BF = cariBF(node);
  96.  
  97. if (BF > 1 && data < node->left->data)
  98. {
  99. return rotateRight(node);
  100. }
  101. if (BF < -1 && data > node->right->data)
  102. {
  103. return rotateLeft(node);
  104. }
  105. if (BF > 1 && data > node->left->data)
  106. {
  107. node->left = rotateLeft(node->left);
  108. return rotateRight(node);
  109. }
  110. if (BF < -1 && data < node->right->data)
  111. {
  112. node->right = rotateRight(node->right);
  113. return rotateLeft(node);
  114. }
  115.  
  116. return node;
  117.  
  118. }
  119.  
  120. void hitungkolom(struct AVLNode *root, int *totalkolom, int *byk_kolom, int kolom)
  121. {
  122. if (root == NULL)
  123. {
  124. return;
  125. }
  126. totalkolom[kolom] += root->data; // jumlah nilai pd node
  127. byk_kolom[kolom]++; // hitung jmlh kolom
  128. hitungkolom(root->left, totalkolom, byk_kolom, kolom - 1); // indeks kolom
  129. hitungkolom(root->right, totalkolom, byk_kolom, kolom + 1);
  130. }
  131.  
  132. int kuadrat(int *totalkolom, int byk_kolom)
  133. {
  134. int ttl = 0;
  135. for (int i = 0; i < byk_kolom; i++)
  136. {
  137. ttl += totalkolom[i] * totalkolom[i];
  138. }
  139. return ttl;
  140. }
  141.  
  142. int main()
  143. {
  144. char cmd[10];
  145. int node;
  146. struct AVLNode *root = NULL;
  147.  
  148. while (scanf("%s", cmd) != EOF)
  149. {
  150. if (cmd[0] == 'M')
  151. {
  152. scanf("%d", &node);
  153. root = insert(root, node);
  154. }
  155. else if (cmd[0] == 'H')
  156. {
  157. int totalkolom[1001] = {0};
  158. int byk_kolom[1001] = {0};
  159. hitungkolom(root, totalkolom, byk_kolom, 500);
  160. printf("%d\n", kuadrat(totalkolom, 1001));
  161. }
  162. }
  163.  
  164. return 0;
  165. }
Success #stdin #stdout 0s 5476KB
stdin
MASUKKAN 3
MASUKKAN 6
MASUKKAN 2
MASUKKAN 1
MASUKKAN 8
MASUKKAN 5
MASUKKAN 4
HITUNG
stdout
201