Tuesday, March 3, 2020

AVL Tree

AVL Tree adalah teknik untuk mempercepat searching di BST. AVL Tree memiliki perbedaan dengan tinggi/level hanya 1 dari subtree kiri dan subtree kanan. Jika salah satu subtree tinggi/levelnya 2, maka ada 2 cara untuk menyeimbangkan tree.

1. Single Rotation. Dimana poros rotasinya diambil dari titik ketidakseimbangan dan dijadikan parent.
AVL Tree Insertion, Rotation, and Balance Factor Explained
https://www.freecodecamp.org/news/avl-tree-insertion-rotation-and-balance-factor/

2. Double Rotation. Dimana poros rotasinya diambil dari titik ketidak seimbangan dan dijadikan menjadi subtree dari titik yang berat.
Why do we need double-rotations to rebalance AVL trees? - Computer ...
https://cs.stackexchange.com/questions/55717/why-do-we-need-double-rotations-to-rebalance-avl-trees

Rangkuman Single Linked List

Perbedaan Linked List dengan Array adalah data array bisa diakses langsung:
Contoh:
[A][B][C][D][E]
[0][1][2][3][4]
Jika kita minta data ke 3, maka diberi "D".

Sedangkan jika linked list harus dimulai dari awal:
[0][1][2][3]
[A][B][C][D]
Jika kita minta node ke 3, maka diberi "A","B",C","D"

Didalam Linked List, ada istilah head and tail, yaitu awal dan akhir dari linked list tersebut.

Lalu, dalam Linked List, diperlukan adanya memory allocation. Jika array kita set berapa isinya, di Linked List harus membuat linked list baru di alokasikan memorynya.

Lalu, untuk melepas alokasi memory, diperlukan penggunaan free, tidak seperti array yang hanya dibiarkan saja elemen datanya kosong.

Pembuatan linked list memerlukan penggunaan data type struct.
Contoh:
struct LinkedList {
 int value;
struct LinkedList *next;
}; *head, *tail = 0;

Untuk memasukkan data selanjutnya diperlukan, diperlukan penambahan malloc.
Contoh:
struct LinkedList *node = (struct LinkedList*) malloc(sizeof(struct LinkedList));
node->value=5;
node->next=head;
head = node;

Jika ingin menghapus, menggunakan function ini:
if ( head->value == x ) {  head = head->next;  free(curr);
};else {  while ( curr->next->value != x ) curr = curr->next;  struct tnode *del = curr->next;  curr->next = del->next;  free(del);};


Untuk memprint Linked List, menggunakan:
struct LinkedList* value = head;
while (value)
{
printf("%d -> ", value->data);
value = value->next;
}

Untuk function push, bisa menggunakan:
newNode->data = data;
newNode->next = *head;
*head = newNode;
}

Lalu, untuk pop, bisa menggunakan:
if (*headRef == NULL)
return -1;
struct LinkedList* head = *headRef;
int result = head->data;
(*headRef) = (*headRef)->next;
free(head);
return result;

Reference:
https://www.techiedelight.com/pop-operation-in-linked-list/
Ppt Dastruct