Pohon Biner dalam Struktur Data (CONTOH)
Apa itu Pohon Biner?
Kata biner berarti dua. Dalam struktur data pohon “Pohon Biner” berarti pohon yang setiap nodenya dapat memiliki maksimal dua node anak (node kiri dan kanan). Ini adalah pohon biner sederhana.
Namun, ada pohon biner lain yang paling sering digunakan dan memiliki beberapa kasus penggunaan. Pohon ini disebut Pohon Pencarian Biner (BST). Pohon ini dapat membuat algoritma pencarian jauh lebih cepat, tepatnya kompleksitas waktu log(n). Dalam struktur data, n berarti jumlah simpul dalam pohon biner.
Apa Perbedaan Antara Pohon Biner dan Pohon Pencarian Biner?
Perbedaan BST dengan Binary Tree biasa adalah pada BST node kiri mempunyai nilai lebih kecil dibandingkan node root, dan node kanan mempunyai nilai lebih besar dibandingkan node root. Jadi, subpohon kiri akan selalu berisi nilai yang lebih kecil dari akarnya, dan subpohon kanan akan selalu berisi nilai lebih besar dari akarnya.
Contoh Pohon Pencarian Biner
Mari kita ambil contoh berikut untuk menunjukkan konsep Pohon Pencarian Biner.
Di sini Anda dapat semua node mengikuti disiplin yang diberikan. Ada rumus untuk jumlah maksimum node di Pohon Pencarian Biner. Jika kita mengamati pohon di atas, kita dapat melihat setiap node memiliki dua anak kecuali semua node daun. Dan tinggi(h) Pohon Biner yang diberikan adalah 4. Rumusnya adalah 2h - 1. Jadi, hasilnya adalah 15.
Gambar di atas bukanlah Pohon Biner Lengkap atau Pohon Biner Seimbang, melainkan disebut Pohon Biner Lengkap atau Pohon Biner Seimbang. Ada Struktur Data lain yang disebut AVL (jenis lain dari Pohon Biner) yang mengoptimalkan ketinggian Pohon Biner dan melakukan pencarian BST lebih cepat seperti pada Gambar 3.
Cobalah untuk menghitung traversal berurutan dari Pohon Biner yang diberikan di atas. Anda akan menemukan bahwa ini akan memberikan array yang diurutkan tidak menurun, dan algoritma Traversal akan sama dengan Pohon Biner.
Jenis Pohon Biner
Berikut adalah beberapa jenis Pohon Biner yang penting:
- Pohon Biner Penuh: Setiap node dapat memiliki 0 atau 2 node anak di pohon biner ini. Hanya satu simpul anak yang tidak diperbolehkan dalam jenis pohon biner ini. Jadi, kecuali node daun, semua node akan memiliki 2 anak.
- Pohon Biner Penuh: Setiap node dapat memiliki 0 atau 2 node. Kelihatannya seperti Pohon Biner Penuh, namun semua elemen daunnya condong ke subpohon kiri, sedangkan pada pohon biner penuh simpulnya bisa berada di subpohon kanan atau kiri.
- Pohon Biner Sempurna: Semua simpul harus memiliki 0 atau 2 simpul, dan semua simpul daun harus berada pada tingkat atau tinggi yang sama. Contoh struktur pohon biner penuh di atas bukanlah Pohon Biner Sempurna karena simpul 6 dan simpul 1,2,3 tidak berada pada ketinggian yang sama. Namun contoh Pohon Biner Lengkap adalah pohon biner sempurna.
- Pohon Biner yang Merosot: Setiap node hanya dapat memiliki satu anak. Semua operasi seperti pencarian, penyisipan, dan penghapusan membutuhkan waktu O(N).
- Pohon Biner Seimbang: Di sini pohon biner ini, perbedaan tinggi subpohon kiri dan kanan paling banyak adalah 1. Jadi, saat menambah atau menghapus sebuah simpul, kita perlu menyeimbangkan kembali tinggi pohon tersebut. Jenis Pohon Biner Self-Balanced disebut Pohon AVL.
Ada tiga operasi dasar BST. Hal tersebut dibahas secara rinci di bawah ini.
Implementasi Pohon Biner di C dan C++
#include <iostream> #include <bits/stdc++.h> using namespace std; struct Node { int value; struct Node *left, *right; } struct Node *getEmptynode(int val) { struct Node *tempNode = (struct Node *)malloc(sizeof(struct Node)); tempNode->value = val; tempNode->left = NULL; tempNode->right = NULL; return tempNode; } struct Node *successor(struct Node *node) { struct Node *present = node; // going to the left most node while (present != NULL && present->left != NULL) { present = present->left; } return present; } struct Node *insert(struct Node *node, int value) { if (node == NULL) { return getEmptynode(value); } if (value < node->value) { node->left = insert(node->left, value); } else { node->right = insert(node->right, value); } return node; } int searchInBST(struct Node *node, int value) { struct Node *current = node; while (current->value != value) { if (current->value > value) { current = current->left; } else { current = current->right; } if (current == NULL) { return 0; } } return 1; } void inorder(struct Node *root) { if (root != NULL) { inorder(root->left); cout << root->value << " "; inorder(root->right); } } struct Node *deleteNode(struct Node *node, int value) { if (node == NULL) { return node; } if (value < node->value) { node->left = deleteNode(node->left, value); } else if (value > node->value) { node->right = deleteNode(node->right, value); } else { if (node->left == NULL) { struct Node *temp = node->right; free(node); return temp; } else if (node->right == NULL) { struct Node *temp = node->left; free(node); return temp; } struct Node *temp = successor(node->right); node->value = temp->value; node->right = deleteNode(node->right, temp->value); } return node; } int main() { struct Node *root = NULL; root = insert(root, 8); root = insert(root, 4); root = insert(root, 12); root = insert(root, 2); root = insert(root, 6); root = insert(root, 10); root = insert(root, 14); root = insert(root, 1); root = insert(root, 3); root = insert(root, 5); root = insert(root, 7); root = insert(root, 9); root = insert(root, 11); root = insert(root, 13); root = insert(root, 15); cout << "InOrder Traversal after inserting all nodes: " << endl; inorder(root); root = insert(root, -10); cout << "\nInOrder Traversal after inserting -10 : " << endl; inorder(root); cout << "\nSearching -5 in the BST: " << searchInBST(root, -5) << endl; cout << "Searching -10 in the BST: " << searchInBST(root, -10) << endl; root = deleteNode(root,8); cout<<"After deleting node 8, inorder traversal: "<<endl; inorder(root); root = deleteNode(root,-10); cout<<"\nAfter deleting node -10, inorder traversal: "<<endl; inorder(root); }
Keluaran:
InOrder Traversal after inserting all nodes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 InOrder Traversal after inserting -10 : 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Searching -5 in the BST: 0 Searching -10 in the BST: 1 After deleting node 8, inorder traversal: -10 1 2 3 4 5 6 7 9 10 11 12 13 14 15 After deleting node -10, inorder traversal: 1 2 3 4 5 6 7 9 10 11 12 13 14 15
Implementasi Pohon Biner di Python
class Node: def __init__(self,value): self.left = None self.right = None self.value = value def insert(root,value): if root == None: return Node(value) if value< root.value: root.left = insert(root.left,value) else: root.right = insert(root.right,value) return root def searchInBST(root,value): current = root while current.value != value: if current.value > value: current = current.left else: current = current.right if current == None: return "Not found" return "Found" def inorder(root): if root != None: inorder(root.left) print(root.value,end=" ") inorder(root.right) def successor(root): present = root while present != None and present.left != None: present = present.left return present def deleteNode(root,value): if root == None: return root if value < root.value: root.left = deleteNode(root.left, value) elif value>root.value: root.right = deleteNode(root.right, value) else: if root.left == None: temp = root.right root = None return temp elif root.right == None: temp = root.left root = None return temp temp = successor(root.right) root.value = temp.value root.right = deleteNode(root.right, temp.value) return root root = Node(8) root = insert(root, 4) root = insert(root, 12) root = insert(root, 2) root = insert(root, 6) root = insert(root, 10) root = insert(root, 14) root = insert(root, 1) root = insert(root, 3) root = insert(root, 5) root = insert(root, 7) root = insert(root, 9) root = insert(root, 11) root = insert(root, 13) root = insert(root, 15) print("InOrder Traversal after inserting all nodes: ") inorder(root) root = insert(root, -10) print("\nInOrder Traversal after inserting -10 : ") inorder(root) print("\nSearching -5 in the BST: ",searchInBST(root, -5)) print("Searching -5 in the BST: ",searchInBST(root, -10)) root = deleteNode(root,8) print("After deleting node 8, inorder traversal:") inorder(root) root = deleteNode(root,-10) print("\nAfter deleting node -10, inorder traversal:") inorder(root)
Keluaran:
InOrder Traversal after inserting all nodes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 InOrder Traversal after inserting -10 : -10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Searching -5 in the BST: Not found Searching -5 in the BST: Found After deleting node 8, inorder traversal: -10 1 2 3 4 5 6 7 9 10 11 12 13 14 15 After deleting node -10, inorder traversal: 1 2 3 4 5 6 7 9 10 11 12 13 14 15
Penerapan Pohon Biner
Berikut adalah beberapa aplikasi umum dari Pohon Biner:
- Mengatur data node dalam urutan yang diurutkan
- Digunakan di peta dan mengatur objek node di perpustakaan bahasa pemrograman.
- Mencari elemen dalam struktur data
» Pelajari tutorial kami berikutnya tentang Algoritma Kombinasi