Advertisement
agusilham01

avl tree

Jun 25th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  struct AVLTree_Node {
  4.  int data, bfactor;
  5.  struct AVLTree_Node *link[2];
  6.  };
  7.  struct AVLTree_Node *root = NULL;
  8.  struct AVLTree_Node * createNode(int data) {
  9.  struct AVLTree_Node *nodebaru;
  10.  nodebaru = (struct AVLTree_Node *)malloc(sizeof (struct AVLTree_Node));
  11.  nodebaru->data = data;
  12.  nodebaru->bfactor = 0;
  13.  nodebaru->link[0] = nodebaru->link[1] = NULL;
  14.  return nodebaru;
  15.  }
  16.  int count(struct AVLTree_Node *myNode) {
  17.  int c=0;
  18.  if(myNode != NULL){
  19.   int left = count(myNode->link[0]);
  20.   int right = count(myNode->link[1]);
  21.   int lr=1;
  22.   c = left+right+lr;
  23.   }
  24.  return c;
  25.  }
  26.  void insertion (int data) {
  27.  struct AVLTree_Node *bf, *parent_bf, *subtree, *temp;
  28.  struct AVLTree_Node *current, *parent, *nodebaru, *ptr;
  29.  int res = 0, link_dir[32], i = 0;
  30.  if (!root) {
  31.  root = createNode(data);
  32.  return;
  33.  }
  34.  bf = parent_bf = root;
  35.  /* MENCARI LOKASI UNTUK INSERT NODE BARU */
  36.  for (current = root; current != NULL; ptr = current, current = current->link[res]) {
  37.  if (data == current->data) {
  38.  printf("tidak dapat diinser duplikasi !!\n");
  39.  return;
  40.  }
  41.  res = (data > current->data) ? 1 : 0;
  42.  parent = current;
  43.  if (current->bfactor != 0) {
  44.  bf = current;
  45.  parent_bf = ptr;
  46.  i = 0;
  47.  }
  48.  link_dir[i++] = res;
  49.  }
  50.  /* membuat node baru */
  51.  nodebaru = createNode(data);
  52.  parent->link[res] = nodebaru;
  53.  res = link_dir[i = 0];
  54.  /* update keseimbangan node setelah di insert */
  55.  for (current = bf; current != nodebaru; res = link_dir[++i]) {
  56.  if (res == 0)
  57.  current->bfactor--;
  58.  else
  59.  current->bfactor++;
  60.  current = current->link[res];
  61.  }
  62.  /* sub-tree kanan */
  63.  if (bf->bfactor == 2) {
  64.  printf("bfactor = 2\n");
  65.  temp = bf->link[1];
  66.  if (temp->bfactor == 1) {
  67.  /*
  68.  * single rotation(SR) kiri
  69.  * x y
  70.  * \ / \
  71.  * y => x z
  72.  * \
  73.  * z
  74.  */
  75.  subtree = temp;
  76.  bf->link[1] = temp->link[0];
  77.  temp->link[0] = bf;
  78.  temp->bfactor = bf->bfactor = 0;
  79.  } else {
  80.  /*
  81.  * double rotation (SR kanan + SR kiri)
  82.  * x x z
  83.  * \ \ / \
  84.  * y => z => x y
  85.  * / \ ///
  86.  * z y
  87.  */
  88.  subtree = temp->link[0];
  89.  temp->link[0] = subtree->link[1];
  90.  subtree->link[1] = temp;
  91.  bf->link[1] = subtree->link[0];
  92.  subtree->link[0] = bf;
  93.  /* update faktor keseimbangan */
  94.  if (subtree->bfactor == -1) {
  95.  bf->bfactor = 0;
  96.  temp->bfactor = 1;
  97.  } else if (subtree->bfactor == 0) {
  98.  bf->bfactor = 0;
  99.  temp->bfactor = 0;
  100.  } else if (subtree->bfactor == 1) {
  101.  bf->bfactor = -1;
  102.  temp->bfactor = 0;
  103.  }
  104.  subtree->bfactor = 0;
  105.  }
  106.  /* sub-tree kiri*/
  107.  } else if (bf->bfactor == -2) {
  108.  temp = bf->link[0];
  109.  if (temp->bfactor == -1) {
  110.  /*
  111.  * single rotation(SR) kanan
  112.  * x y
  113.  * / / \
  114.  * y => z x
  115.  * /
  116.  * z
  117.  */
  118.  subtree = temp;
  119.  bf->link[0] = temp->link[1];
  120.  temp->link[1] = bf;
  121.  temp->bfactor = bf->bfactor = 0;
  122.  } else {
  123.  /*
  124.  * double rotation - (SR kiri + SR kanan)
  125.  * x x z
  126.  * / / / \
  127.  * y => z => y x
  128.  * \ /
  129.  * z y
  130.  */
  131.  subtree = temp->link[1];
  132.  temp->link[1] = subtree->link[0];
  133.  subtree->link[0] = temp;
  134.  bf->link[0] = subtree->link[1];
  135.  subtree->link[1] = bf;
  136.  /* update faktor keseimbangan */
  137.  if (subtree->bfactor == -1) {
  138.  bf->bfactor = 1;
  139.  temp->bfactor = 0;
  140.  } else if (subtree->bfactor == 0) {
  141.  bf->bfactor = 0;
  142.  temp->bfactor = 0;
  143.  } else if (subtree->bfactor == 1) {
  144.  bf->bfactor = 0;
  145.  temp->bfactor = -1;
  146.  }
  147.  subtree->bfactor = 0;
  148.  }
  149.  } else {
  150.  return;
  151.  }
  152.  if (bf == root) {
  153.  root = subtree;
  154.  return;
  155.  }
  156.  if (bf != parent_bf->link[0]) {
  157.  parent_bf->link[1] = subtree;
  158.  } else {
  159.  parent_bf->link[0] = subtree;
  160.  }
  161.  return;
  162.  }
  163.  void deletion(int data) {
  164.  int link_dir[32], res = 0, i = 0, j = 0, index = 0;
  165.  struct AVLTree_Node *ptr[32], *current, *temp, *x, *y, *z;
  166.  current = root;
  167.  if (!root) {
  168.  printf("Tree tidak ada \n");
  169.  return;
  170.  }
  171.  if ((root->data == data) && (root->link[0] == NULL)
  172.  && (root->link[1] == NULL)) {
  173.  free(root);
  174.  root = NULL;
  175.  return;
  176.  }
  177.  /* mencari node yang mau di hapus */
  178.  while (current != NULL) {
  179.  if (current->data == data)
  180.  break;
  181.  res = data > current->data ? 1 : 0;
  182.  link_dir[i] = res;
  183.  ptr[i++] = current;
  184.  current = current->link[res];
  185.  }
  186.  if (!current) {
  187.  printf("Data tidak ada !!\n");
  188.  return;
  189.  }
  190.  index = link_dir[i - 1];
  191.  temp = current->link[1];
  192.  /* hapus node dari AVL tree - sama dan mirip hapus pada BST */
  193.  if (current->link[1] == NULL) {
  194.  if (i == 0) {
  195.  temp = current->link[0];
  196.  free(current);
  197.  root = temp;
  198.  return;
  199.  } else {
  200.  ptr[i - 1]->link[index] = current->link[0];
  201.  }
  202.  } else if (temp->link[0] == NULL) {
  203.  temp->link[0] = current->link[0];
  204.  temp->bfactor = current->bfactor;
  205.  if (i > 0) {
  206.  ptr[i-1]->link[index] = temp;
  207.  } else {
  208.  root = temp;
  209.  }
  210.  link_dir[i] = 1;
  211.  ptr[i++] = temp;
  212.  } else {
  213.  /* menghapus node dengan dua anak */
  214.  j = i++;
  215.  while (1) {
  216.  link_dir[i] = 0;
  217.  ptr[i++] = temp;
  218.  x = temp->link[0];
  219.  if (x->link[0] == NULL)
  220.  break;
  221.  temp = x;
  222.  }
  223.  x->link[0] = current->link[0];
  224.  temp->link[0] = x->link[1];
  225.  x->link[1] = current->link[1];
  226.  x->bfactor = current->bfactor;
  227.  if (j > 0) {
  228.  ptr[j - 1]->link[index] = x;
  229.  } else {
  230.  root = x;
  231.  }
  232.  link_dir[j] = 1;
  233.  ptr[j] = x;
  234.  }
  235.  free(current);
  236.  for (i = i - 1; i >= 0; i = i--) {
  237.  x = ptr[i];
  238.  if (link_dir[i] == 0) {
  239.  x->bfactor++;
  240.  if (x->bfactor == 1) {
  241.  break;
  242.  } else if (x->bfactor == 2) {
  243.  y = x->link[1];
  244.  if (y->bfactor == -1) {
  245.  /* double rotasi - (SR kanan + SR kiri) */
  246.  z = y->link[0];
  247.  y->link[0] = z->link[1];
  248.  z->link[1] = y;
  249. x->link[1] = z->link[0];
  250.  z->link[0] = x;
  251. /* mengupdate faktor keseimbangan */
  252. if (z->bfactor == -1) {
  253.  x->bfactor = 0;
  254. y->bfactor = 1;
  255.  } else if (z->bfactor == 0) {
  256.  x->bfactor = 0;
  257. y->bfactor = 0;
  258.  } else if (z->bfactor == 1) {
  259.  x->bfactor = -1;
  260.  y->bfactor = 0;
  261.  }
  262. z->bfactor = 0;
  263.  if (i > 0) {
  264.  index = link_dir[i - 1];
  265.  ptr[i - 1]->link[index] = z;
  266.  } else {
  267.  root = z;
  268.  }
  269.  } else {
  270.  /* single rotasi kiri */
  271.  x->link[1] = y->link[0];
  272.  y->link[0] = x;
  273. if (i > 0) {
  274.  index = link_dir[i - 1];
  275.  ptr[i - 1]->link[index] = y;
  276.  } else {
  277.  root = y;
  278.  }
  279. /* meng update faktor keseimbangan/balance*/
  280.  if (y->bfactor == 0) {
  281.  x->bfactor = 1;
  282. y->bfactor = -1;
  283.  break;
  284.  } else {
  285.  x->bfactor = 0;
  286. y->bfactor = 0;
  287.  }
  288.  }
  289.  }
  290.  } else {
  291.  x->bfactor--;
  292.  if (x->bfactor == -1) {
  293.  break;
  294.  } else if (x->bfactor == -2) {
  295.  y = x->link[0];
  296.  if (y->bfactor == 1) {
  297.  /* double rotasi - (SR kanan + SR kiri) */
  298.  z = y->link[1];
  299. y->link[1] = z->link[0];
  300.  z->link[0] = y;
  301. x->link[0] = z->link[1];
  302.  z->link[1] = x;
  303.  /* meng-update faktor keseimbangan / balance */
  304.  if (z->bfactor == -1) {
  305.  x->bfactor = 1;
  306. y->bfactor = 0;
  307.  } else if (z->bfactor == 0) {
  308.  x->bfactor = 0;
  309. y->bfactor = 0;
  310.  } else if (z->bfactor == 1) {
  311.  x->bfactor = 0;
  312. y->bfactor = -1;
  313.  }
  314. z->bfactor = 0;
  315.  if (i > 0) {
  316.  index = link_dir[i - 1];
  317.  ptr[i - 1]->link[index] = z;
  318.  } else {
  319.  root = z;
  320.  }
  321.  } else {
  322.  /* single rotasi kanan */
  323. x->link[0] = y->link[1];
  324.  y->link[1] = x;
  325. if (i <= 0) {
  326.  root = y;
  327.  } else {
  328.  index = link_dir[i - 1];
  329.  ptr[i - 1]->link[index] = y;
  330.  }
  331. /* meng-update faktor keseimbangan / balance */
  332.  if (y->bfactor == 0) {
  333.  x->bfactor = -1;
  334.  y->bfactor = 1;
  335.  break;
  336. } else {
  337.  x->bfactor = 0;
  338. y->bfactor = 0;
  339.  }
  340.  }
  341.  }
  342.  }
  343.  }
  344.  }
  345.  void searchElement(int data) {
  346.  int flag = 0, res = 0;
  347.  struct AVLTree_Node *node = root;
  348.  if (!node) {
  349.  printf("AVL tree tidak ada !!\n");
  350.  return;
  351.  }
  352.  while (node != NULL) {
  353.  if (data == node->data) {
  354.  printf("%d ada pada AVL Tree\n", data);
  355.  flag = 1;
  356.  break;
  357.  }
  358.  res = data > node->data ? 1 : 0;
  359.  node = node->link[res];
  360.  }
  361.  if (!flag)
  362.  printf("Elemen yang dicari tdk ada didalam AVL tree\n");
  363.  return;
  364.  }
  365.  
  366.  void inorderTraversal(struct AVLTree_Node *myNode) {
  367.  if (myNode) {
  368.  inorderTraversal(myNode->link[0]);
  369.  printf("%d ", myNode->data);
  370.  inorderTraversal(myNode->link[1]);
  371.  }
  372.  return;
  373.  }
  374.  
  375.  int main() {
  376.  int key, ch,c;
  377.  while (1) {
  378.  printf("1. Sisip\insert\t2. Hapus\n");
  379.  printf("3. Cari \t4. Penelusuran\n");
  380.  printf("5. Jumlah Node\t6. Exit \nMasukkan pilihan :");
  381.  scanf("%d", &ch);
  382.  switch (ch) {
  383.  case 1:
  384.  printf("Masukkan Nilai :");
  385.  scanf("%d", &key);
  386.  insertion(key);
  387.  break;
  388.  case 2:
  389.  printf("Masukkan Nilai yang akan di delete:");
  390.  scanf("%d", &key);
  391.  deletion(key);
  392.  break;
  393.  case 3:
  394.  printf("Masukkan Nilai yang akan dicari :");
  395.  scanf("%d", &key);
  396.  searchElement(key);
  397.  break;
  398.  case 4:
  399.  inorderTraversal(root);
  400.  printf("\n");
  401.  break;
  402.  case 5:
  403.  c = count(root);
  404.  printf("\ntotal node: %d\n", c);
  405.  break;
  406.  case 6:
  407.  exit(0);
  408.  default:
  409.  printf("Pilihan Anda salah!!\n");
  410.  break;
  411.  }
  412.  printf("\n");
  413.  }
  414.  return 0;
  415.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement