Pertemuan 12
Universitas Pertahanan RI
Setelah pertemuan ini, mahasiswa mampu:
Pada Pertemuan 11, kita mempelajari:
Bagaimana membuat pencarian lebih efisien?
Binary Search Tree (BST) adalah Binary Tree dimana untuk setiap node:
Gambar 12.1: Properti Binary Search Tree
struct BSTNode {
int data;
BSTNode* left;
BSTNode* right;
// Constructor
BSTNode(int value) : data(value), left(nullptr), right(nullptr) {}
};
Sama dengan Binary Tree, tapi dengan aturan pengurutan
| Aspek | Binary Tree | BST |
|---|---|---|
| Pengurutan | Tidak ada aturan | Terurut |
| Search | O(n) | O(log n) avg |
| Insert | O(n) | O(log n) avg |
| Inorder Traversal | Urutan acak | Terurut ascending! |
Apakah tree berikut adalah BST yang valid?
10
/ \
5 15
/ \
3 12
Jawaban: TIDAK VALID!
Node 12 berada di left subtree dari root 10, tapi 12 > 10.
Semua node di left subtree harus < root.
Algoritma:
Gambar 12.2: Proses pencarian pada BST
Setiap langkah mengeliminasi setengah dari tree!
BSTNode* search(BSTNode* root, int key) {
// Base case
if (root == nullptr || root->data == key) {
return root;
}
// Key lebih kecil, cari di kiri
if (key < root->data) {
return search(root->left, key);
}
// Key lebih besar, cari di kanan
return search(root->right, key);
}
BSTNode* searchIterative(BSTNode* root, int key) {
BSTNode* current = root;
while (current != nullptr) {
if (key == current->data) {
return current; // Ditemukan
} else if (key < current->data) {
current = current->left;
} else {
current = current->right;
}
}
return nullptr; // Tidak ditemukan
}
Algoritma:
Catatan: BST standar tidak mengizinkan nilai duplikat
Gambar 12.4: Proses penyisipan nilai pada BST
BSTNode* insert(BSTNode* root, int value) {
// Base case: posisi ditemukan
if (root == nullptr) {
return new BSTNode(value);
}
// Rekursi ke subtree yang sesuai
if (value < root->data) {
root->left = insert(root->left, value);
} else if (value > root->data) {
root->right = insert(root->right, value);
}
// Jika value == root->data, diabaikan
return root;
}
Insert: 50, 30, 70, 20, 40, 60, 80
50
/ \
30 70
/ \ / \
20 40 60 80
Traverse ke left-most node
BSTNode* findMin(BSTNode* root) {
if (root == nullptr)
return nullptr;
while (root->left != nullptr)
root = root->left;
return root;
}
Traverse ke right-most node
BSTNode* findMax(BSTNode* root) {
if (root == nullptr)
return nullptr;
while (root->right != nullptr)
root = root->right;
return root;
}
50
/ \
30 70
/ \ / \
20 40 60 80
/
15
findMin:
50 β 30 β 20 β 15
Min = 15
findMax:
50 β 70 β 80
Max = 80
Tiga kasus yang perlu ditangani:
| Kasus | Kondisi | Solusi |
|---|---|---|
| 1 | Node adalah leaf | Hapus langsung |
| 2 | Node punya 1 anak | Ganti dengan anaknya |
| 3 | Node punya 2 anak | Ganti dengan inorder successor |
Gambar 12.5: Penghapusan leaf node
Cukup set parentβchild = nullptr
Gambar 12.6: Penghapusan node dengan satu anak
Bypass: Hubungkan parent langsung ke child
Gambar 12.7: Penghapusan node dengan dua anak
Inorder Successor adalah node dengan nilai terkecil yang lebih besar dari node yang dihapus.
Cara mencari:
findMin(right subtree)
Langkah: Copy nilai successor β Hapus node successor
BSTNode* deleteNode(BSTNode* root, int key) {
if (root == nullptr) return nullptr;
// Cari node yang akan dihapus
if (key < root->data) {
root->left = deleteNode(root->left, key);
} else if (key > root->data) {
root->right = deleteNode(root->right, key);
} else {
// Kasus 1 & 2: Leaf atau satu anak
if (root->left == nullptr) {
BSTNode* temp = root->right;
delete root;
return temp;
} else if (root->right == nullptr) {
BSTNode* temp = root->left;
delete root;
return temp;
}
// Kasus 3: Dua anak
BSTNode* successor = findMin(root->right);
root->data = successor->data;
root->right = deleteNode(root->right, successor->data);
}
return root;
}
Pada BST berikut, apa yang terjadi saat delete(50)?
50
/ \
30 70
/ \ / \
20 40 60 80
Jawaban:
60
/ \
30 70
/ \ \
20 40 80
| Operasi | Best | Average | Worst |
|---|---|---|---|
| Search | O(1) | O(log n) | O(n) |
| Insert | O(1) | O(log n) | O(n) |
| Delete | O(1) | O(log n) | O(n) |
| findMin/Max | O(1) | O(log n) | O(n) |
Kompleksitas bergantung pada bentuk tree
Gambar 12.3: Perbandingan BST seimbang dan tidak seimbang
| Bentuk Tree | Tinggi | Operasi |
|---|---|---|
| Perfectly Balanced | βlogβ(n)β | O(log n) |
| Reasonably Balanced | O(log n) | O(log n) |
| Skewed/Degenerate | n - 1 | O(n) |
Insert: 1, 2, 3, 4, 5
1
\
2
\
3
\
4
\
5
Masalah:
Berapa perbandingan untuk mencari 75?
BST A (Balanced):
50
/ \
25 75
/ \ / \
10 30 60 90
BST B (Skewed):
10-25-30-50-60-75
BST A: 2
75 > 50 β 75 == 75 β
BST B: 6
10β25β30β50β60β75 β
BST balanced 3x lebih efisien!
Self-balancing BST menjamin O(log n)
| Tipe | Mekanisme | Kompleksitas |
|---|---|---|
| AVL Tree | Balance factor + rotasi | O(log n) guaranteed |
| Red-Black Tree | Pewarnaan + rotasi | O(log n) guaranteed |
| Splay Tree | Splaying | Amortized O(log n) |
Detail implementasi: materi lanjutan/pengayaan
Untuk data {1, 2, 3, 4, 5, 6, 7}:
β Urutan: 1,2,3,4,5,6,7
Hasil: Skewed tree
β Urutan: 4,2,6,1,3,5,7
Hasil: Balanced tree
(Insert median dulu!)
Sistem Radar dengan Range Query
Mencari semua objek dalam jarak tertentu
void rangeSearch(BSTNode* root, int low, int high, vector<int>& result) {
if (root == nullptr) return;
if (root->data > low)
rangeSearch(root->left, low, high, result);
if (root->data >= low && root->data <= high)
result.push_back(root->data);
if (root->data < high)
rangeSearch(root->right, low, high, result);
}
Objek pada jarak: 50, 75, 120, 150, 180, 200, 250 km
Query: Cari objek jarak 100-200 km
Hasil: 120, 150, 180, 200 km
Kompleksitas: O(h + k), h=tinggi, k=hasil
Inorder traversal pada BST menghasilkan elemen terurut ascending
50
/ \
30 70
/ \ / \
20 40 60 80
Inorder: 20, 30, 40, 50, 60, 70, 80
Gunakan untuk: verifikasi BST, print sorted, find k-th element
class BST {
private:
struct Node {
int data;
Node *left, *right;
Node(int val) : data(val), left(nullptr), right(nullptr) {}
};
Node* root;
// Helper functions...
public:
BST() : root(nullptr) {}
~BST() { /* destroy tree */ }
void insert(int value);
bool search(int key);
void remove(int key);
int findMin();
int findMax();
void inorderTraversal();
};
Implementasi lengkap: lihat modul12.md
| Konsep | Deskripsi | Kompleksitas |
|---|---|---|
| BST Property | Left < Parent < Right | - |
| Search | Binary search pada tree | O(log n) avg |
| Insert | Cari posisi, sisipkan | O(log n) avg |
| Delete (leaf) | Hapus langsung | O(log n) avg |
| Delete (2 anak) | Inorder successor | O(log n) avg |
| Worst Case | Skewed tree | O(n) |
| Balanced BST | AVL, Red-Black | O(log n) guaranteed |
Silakan bertanya atau diskusi
Referensi: Cormen Ch.12 | Weiss Ch.4.3 | Hubbard Ch.11
Pertemuan berikutnya: Heap dan Priority Queue
Struktur Data dan Algoritma
Pertemuan 12: Binary Search Tree
Β© 2026 - CC BY 4.0