-
Notifications
You must be signed in to change notification settings - Fork 2
Modul 2 [Binary Search Tree]
Binary Search Tree adalah struktur data pohon biner berbasis node yang memiliki properti sebagai berikut :
- Subtree kiri dari sebuah node hanya berisi node dengan data/key yang lebih kecil dari kunci node.
- Subtree kanan dari sebuah node hanya berisi node dengan data/key lebih besar dari kunci node.
- Subtree kiri dan kanan masing-masing juga harus berupa binary search tree.
Sumber Gambar : https://courses.engr.illinois.edu/cs225/fa2022/assets/notes/bst/bsttreetraversal.png (dengan perubahan)
struct BSTNode {
BSTNode *left, *right;
int key;
};
struct BSTNode {
BSTNode *_root;
unsigned int _size;
};
// Fungsi-Fungsi...
Untuk mengecek apakah BST kosong atau tidak
bool isEmpty() {
return _root == NULL;
}
Berikut adalah cara melakukan pencarian node pada implementasi ini
- Mulai dari root
- Jika value yang dicari lebih kecil dari node yang sedang dicek, pindah ke kiri
- Jika value yang dicari lebih besar dari node yang sedang dicek, pindah ke kanan
Sumber gambar : https://courses.engr.illinois.edu/cs225/fa2022/assets/notes/bst/bstsearch.png
bool find(int value) {
BSTNode *temp = __search(_root, value);
if (!temp)
return false;
if (temp->key == value)
return true;
else
return false;
}
BSTNode* __search(BSTNode *root, int value) {
while (root != NULL) {
if (value < root->key)
root = root->left;
else if (value > root->key)
root = root->right;
else
return root;
}
return root;
}
Untuk menambahkan node, pertama-tama harus ditentukan dulu posisi node yang akan ditambahkan. Setelah mendapat posisi yang sesuai, maka akan dilakukan pembuatan node baru yang berisi value yang ingin ditambahkan. Node baru yang akan ditambahkan akan selalu berada di posisi daun (leaf).
void insert(int value) {
if (!find(value)) {
_root = __insert(_root, value);
_size++;
}
}
BSTNode* __insert(BSTNode *root, int value) {
if (root == NULL)
return __createNode(value);
if (value < root->key)
root->left = __insert(root->left, value);
else if (value > root->key)
root->right = __insert(root->right, value);
return root;
}
Terdapat 3 kondisi pada saat akan remove.
Kondisi 1 Node yang akan dihapus adalah node leaf (tanpa child)
Pada kondisi ini, node akan langsung dihapus
Sumber gambar : https://courses.engr.illinois.edu/cs225/fa2022/assets/notes/bst/removeleaf.png
Kondisi 2 Node yang akan dihapus mempunyai 1 child (kiri atau kanan)
Setelah node dihapus, maka child akan diposisikan pada node yang telah dihapus.
Sumber gambar : https://courses.engr.illinois.edu/cs225/fa2022/assets/notes/bst/onechildremove.png
Kondisi 3 Node yang akan dihapus mempunyai 2 child
Sebelum node dihapus, maka akan dilakukan pencarian node terkecil dari subTree kanan child, kemudian akan dilakukan pertukaran. Setelah itu, dilakukan penghapusan node.
void remove(int value) {
if (find(value)) {
_root = __remove(_root, value);
_size++;
}
}
BSTNode* __remove(BSTNode *root, int value) {
if (root == NULL) return NULL;
if (value > root->key)
root->right = __remove(root->right, value);
else if (value < root->key)
root->left = __remove(root->left, value);
else {
if (root->left == NULL) {
BSTNode *rightChild = root->right;
free(root);
return rightChild;
}
else if (root->right == NULL) {
BSTNode *leftChild = root->left;
free(root);
return leftChild;
}
BSTNode *temp = __findMinNode(root->right);
root->key = temp->key;
root->right = __remove(root->right, temp->key);
}
return root;
}
BSTNode* __findMinNode(BSTNode *node) {
BSTNode *currNode = node;
while (currNode && currNode->left != NULL)
currNode = currNode->left;
return currNode;
}
Jika urutan insertion tree yang dilakukan adalah 5,4,3,2,1 maka bentuk tree akan seperti gambar di bawah, dan ini dinamakan Skewed Tree
Modul 0
Modul 1
Modul 2
Modul 3
Modul 4
Modul 5
Modul 6