Anda di halaman 1dari 21

1.

PENDAHULUAN
Teori pohon pertama kali diperkenalkan sejak tahun 1857, oleh matematikawan Arthur
Cayley yang digunakan untuk menghitung jumlah senyawa kimia. Teori pohon adalah teori yang
digunakan untuk menyelesaikan permasalahan dengan menggunakan analogi permasalahan
kedalam bentuk pohon yang kemudian dicaarikan solusi pemecahan permasalahannya , selain dari
itu teori pohon juga digunakan dalam penerapan konsep graph, dimana pohon dapat didefinisikan
sebagai graph tidak berarah terhubung dan tidak mengandung sirkuit. Penerapan struktur data
merupakan hal yang sangat penting dalam proses pembuatan progam komputer untuk
meningkatkan kinerja program.
Dalam ilmu komputer , pohon biner adalah struktur data pohon di mana setiap simpul
memiliki paling banyak dua anak , yang disebut sebagai anak kiri dan anak kanan . Sebuah definisi
rekursif hanya menggunakan teori himpunan gagasan adalah bahwa (non-kosong) pohon biner
adalah tuple ( L , S , R ), di mana L dan R adalah pohon biner atau himpunan kosong dan S adalah
himpunan Tunggal.

2. Landasan Teori
2.1 Struktur Data
Dalam istilah ilmu komputer, sebuah struktur data adalah cara penyimpanan, penyusunan dan
pengaturan data di dalam media penyimpanan komputer sehingga data tersebut dapat digunakan
secara efisien. Sedangkan Data adalah representasi dari fakta dunia nyata. Fakta atau keterangan
tentang kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk tulisan, suara,
gambar, sinyal atau simbol.
Konstanta digunakan untuk menyatakan nilai tetap sedangkan variable digunakan dalam
program untuk menyatakan nilai yang dapat berubah-ubah selang eksekusi berlangsung.
Ada empat jeis istilah data yaitu :
1. Tipe data adalah jenis atau macam data didalam suatu variable dalam Bahasa
pemrograman.
2. Objek data mengacu Kumpulan elemen, D (domain).
3. Representasi data: Suatu mapping dari sgtruktur data ‘d’ ke suatu set ke struktur data
‘e’(d===e) missal Boolean di-reprsentasikan dalam 0 dan 1.
4. Struktur data biasa dipakai untuk mengelompokan beberapa informasi yang terkait
menjadi sebuah kesatuan
Dalam teknik pemrograman, struktur data berarti tata letak data yang berisi kolom-kolom
data, baik itu kolom yang tampak oleh pengguna (user) ataupun kolom yang hanya digunakan
untuk keperluan pemrograman yang tidak tampak oleh pengguna.Setiap baris dari kumpulan
kolom-kolom tersebut dinamakan catatan (record). Lebar kolom untukdata dapat berubah dan
bervariasi. Ada kolom yang lebarnya berubah secara dinamis sesuai masukan dari pengguna, dan
juga ada kolom yang lebarnya tetap. Dengan sifatnya ini,sebuah struktur data dapat diterapkan
untuk pengolahan database (misalnya untuk keperluan data keuangan) atau untuk pengola kata
(word processor) yang kolomnya berubah secara dinamis.
Struktur Data Non-Linier merupakan salah satu bentuk struktur data tidak linear yang
menggambarkan hubungan yang bersifat hirarkis (hubungan one to many) antara elemen-elemen.
Tree bisa didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus yang disebut
Root dan node lainnya terbagi menjadi himpunan-himpunan yang saling tak berhubungan satu
sama lainnya (disebut subtree).
2.2. Binary Tree
Binary tree (pohon biner) adalah suatu bentuk struktur data nonlinier yang menggambarkan
hubungan hierarki (hubungan satu-ke-banyak) antar elemen. Sebuah Tree dapat didefinisikan
sebagai kumpulan node dengan elemen khusus yang disebut root dan node lainnya (disebut
subpohon). Beberapa jenis Tree mempunyai ciri-ciri khusus, misalnya Binary tree.
Binary tree adalah pohon dengan syarat setiap node hanya dapat memiliki paling banyak dua
subpohon (Subtree), dan kedua subpohon tersebut harus terpisah. Setiap node dalam pohon biner
dapat memiliki hingga dua node anak Secara khusus, node anak disebut kiri dan kanan.
Pohon biner adalah himpunan simpul yang terdiri dari dua subpohon yang saling lepas: subpohon
kiri dan subpohon kanan. Derajat keluar maksimum setiap titik pada pohon biner = 2,

Root/akar
Level Derajat
0 2

1 1

2
0

a. Istilah dan Hubungan Komponen Tree


 Node (Simpul) : adalah simpul dari masing-masing data dari suatu tree.
Contoh : Node = ( A,B C, D,E,F,G,H,I,J)

B C

D E F

G H

I J

 Successor (Penerus) & Subtree : adalah node yang berada dibawah node tertentu
Contoh : Predecessor (D,E,G,H,I,J) = B
A

B C

D E F

G H

I J

 Size : adalah banyaknya node disebuah tree


Contoh : Size = 10
A

B C

D E F

G H

I J

 Ancestor (Leluhur) : Seluruh node yang terletak sebelum node tertentu dan terletak
pada jalur yang sama.
Contoh : Ancestor (J) = G,E,B,A
A

B C

D E F

G H

I J
A

AA

 Descendant (Keturunan) : Seluruh node yang terletak setelah node tertentu dan terletak
pada jalur yang sama. B C
Contoh : Descendant (B) = D,E,G,H,I,J
BB CC

D E F

DD EE FF

G H

GG HH
I J

II JJ

 Parent (Orang tua) : Predecessor (pendahulu) satu level diatas suatu node.
Contoh : Parent (I) = G

 Child (Anak) : adalah successor (penerus) satu level dibawah suatu node.
Contoh : Child (E) = G,H
A
 Sibling (Saudara) : adalah node-node yang memiliki parent yang sama
Contoh : Sibling (D) = E
B C

D E F

G H

I J

 Height : Banyaknya tingkatan dalam suatu tree.


Contoh : Height = 5
A

B C

D E F

G H

I J

 Leaf (Daun) : adalah node-node dalam tree yang tidak memiliki successor (penerus).
Contoh : Leaf = D,F,H,I,J
A

B C

D E F

G H

I J
A
A
 Degree : adalah banyaknya child (anak) dalam suatu node
Contoh : Degree (E) = 2
B C
B C

D E F
D E F

G H
G H

I J
I J

 Forest (Hutan) : adalah kumpulan dari tree.


Contoh : Forest = 15
A

B C

D E F

G H

I J

 Depth (Kedalaman): adalah hasil tingkat node maksimum dikurang satu (level dari
node x).
Contoh : Depth (D) = 2
b. Jenis Binary Tree
 Full Binary Tree
Semua simpul (kecuali daun) memiliki 2 anak dan tiap cabang memiliki panjang ruas
yang sama.

Gambar 1 Full Binary Tree


 Complete Binary Tree
Hampir sama dengan Pohon BinerPenuh, semua simpul (kecualidaun) memiliki 2 anak
tetapi tiap cabang memiliki panjang ruas berbeda.

Gambar 2 Perfect Binary Tree

 Complete Binary Tree


Dua pohon yang semua simpulnya mempunyai satu anak/turunan kecuali daun.

Gambar 3 Complete Binary Tree


A
c. Sifat Binary Tree
 Jika Pohon mempunyai Simpul sebanyak n, maka banyaknya ruas atau edge adalah (n-
1).
B C
 Mempunyai Simpul Khusus yang disebut Root, jika Simpul tersebut memiliki derajat
keluar >= 0, dan derajat masuk = 0.
 Mempunyai Simpul yang disebut D sebagai
E Daun (Leaf),
F jika Simpul tersebut berderajat
keluar = 0, dan berderajat masuk = 1.
 Setiap Simpul mempunyai Tingkatan (Level) yang dimulai dari Root yang Levelnya =
1 sampai dengan Level ke - n pada
G daun paling
H bawah. Simpul yang mempunyai Level
sama disebut Bersaudara atau Brother atau Stribling.
 Pohon mempunyai Ketinggian I atau Kedalaman
J atau Height, yang merupakan Level
tertinggi
 Pohon mempunyai Weight atau Berat atau Bobot, yang banyaknya daun (leaf) pada
Pohon.
 Banyaknya Simpul Maksimum sampai Level N adalah:
2 ( N )−1
 Banyaknya Simpul untuk setiap Level I adalah:
N

∑ 2 (I −1)
I=1

d. Transversal
Adalah teknik menyusuri tiap node dalam sebuah tree secara sistematis, sehingga semua
node dapat dan hanya satu kali saja dikunjungi. Ada 3 cara tranversal
 PreOrder
a. Cetak isi simpul yang dikunjungi (simpul akar),
b. Kunjungi cabang kiri,
c. Kunjungi cabang kanan.

preOrder = A,B,D,E,G,I,J,H,C,F
A
A

 InOrder
a. Kunjungi cabang kiri,
B
b. Cetak isi simpul yang dikunjungi (simpulCC akar),
B
c. Kunjungi cabang kanan
D E F
D E F

G H
G H

I J
I J

inOrder = D,B,I,G,J,E,H,A,F,C

 PostOrder
a. Kunjungi cabang kiri,
b. Kunjungi cabang kanan,
c. Cetak isi simpul yang dikunjungi (simpul akar)

postOrder = D,I,J,G,H,E,B,F,C,A

e. Operasi Binary Tree


 Create : digunakan untuk membentuk binary tree baru yang masih kosong.
 Clear : digunakan untuk mengosongkan binary tree yang sudah ada atau menghapus
semua node pada binary tree.
 Empty : digunakan untuk memeriksa apakah binary tree masih kosong atau tidak.
 Insert : digunakan untuk memasukkan sebuah node kedalam tree.
 Find : digunakan untuk mencari root, parent, left child, atau right child dari suatu node
dengan syarat tree tidak boleh kosong.
 Update : digunakan untuk mengubah isi dari node yang ditunjuk oleh pointer current
dengan syarat tree tidak boleh kosong.
 Retrieve : digunakan untuk mengetahui isi dari node yang ditunjuk pointer current
dengan syarat tree tidak boleh kosong.
 Delete Sub : digunakan untuk menghapus sebuah subtree (node beserta seluruh
descendant-nya) yang ditunjuk pointer current dengan syarat tree tidak boleh kosong.
 Charateristic : digunakan untuk mengetahui karakteristik dari suatu tree. Yakni size,
height, serta average lenght-nya.
 Tranverse : digunakan untuk mengunjungi seluruh node-node pada tree dengan cara
tranvers
3. PEMBAHASAN
3.1. Implementasi Binary Tree
a. Program
#include <iostream>
using namespace std;

// node
struct Node{
char label;
Node *left, *right, *parent;
};

// variabel pointer global


Node *root, *newNode;

// create New Tree


void createNewTree( char label )
{

if( root != NULL )


cout << "\nTree sudah dibuat" << endl;
else{
root = new Node();
root->label = label;
root->left = NULL;
root->right = NULL;
root->parent = NULL;
cout << "\nNode " << label << " berhasil dibuat menjadi root." << endl;
}

}
// insert Left
Node *insertLeft( char label, Node *node )
{
if( root == NULL ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
return NULL;
}else{
// cek apakah anak kiri ada atau tidak
if( node->left != NULL ){
// kalau ada
cout << "\nNode "<< node->label << " sudah ada anak kiri!!" << endl;
return NULL;
}else{
// kalau tidak ada
newNode = new Node();
newNode->label = label;
newNode->left = NULL;
newNode->right = NULL;
newNode->parent = node;
node->left = newNode;
cout << "\nNode " << label << " berhasil ditambahkan ke anak kiri " <<
newNode->parent->label << endl;
return newNode;
}

}
}

// insert right
Node *insertRight( char label, Node *node )
{
if( root == NULL ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
return NULL;
}else{
// cek apakah anak kiri ada atau tidak
if( node->right != NULL ){
// kalau ada
cout << "\nNode " << node->label << " sudah ada anak kanan!!" << endl;
return NULL;
}else{
// kalau tidak ada
newNode = new Node();
newNode->label = label;
newNode->left = NULL;
newNode->right = NULL;
newNode->parent = node;
node->right = newNode;
cout << "\nNode" << label << " berhasil ditambahkan ke anak kanan " <<
newNode->parent->label << endl;
return newNode;
}

}
}

// Empty
bool empty()
{
if( root == NULL )
return true;
else
return false;
}

// update
void update(char label, Node *node)
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
}else{
if( !node )
cout << "\nNode yang ingin diganti tidak ada!!" << endl;
else{
char temp = node->label;
node->label = label;
cout << "\nLabel node " << temp << " berhasil diubah menjadi " << label <<
endl;
}
}
}

// retrieve
void retrieve( Node *node )
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
}else{
if( !node )
cout << "\nNode yang ditunjuk tidak ada!!" << endl;
else{
cout << "\nLabel node : " << node->label << endl;
}
}
}

// Find
void find( Node *node )
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
}else{
if( !node )
cout << "\nNode yang ditunjuk tidak ada!!" << endl;
else{

cout << "\nLabel Node : " << node->label << endl;


cout << "Root Node : " << root->label << endl;

if( !node->parent )
cout << "Parent Node : (tidak punya orang tua)" << endl;
else
cout << "Parent Node : " << node->parent->label << endl;

if( node->parent != NULL && node->parent->left != node && node->parent-


>right == node )

cout << "Saudara : " << node->parent->left->label << endl;

else if( node->parent != NULL && node->parent->right != node &&


node->parent->left == node )

cout << "Saudara : " << node->parent->right->label << endl;

else

cout << "Saudara : (tidak punya saudara)" << endl;

if( !node->left )
cout << "Anak Kiri Node : (tidak punya anak kiri)" << endl;
else
cout << "Anak Kiri Node : " << node->left->label << endl;

if( !node->right )
cout << "Anak Kanan Node : (tidak punya anak kanan)" << endl;
else
cout << "Anak Kanan Node : " << node->right->label << endl;

}
}

// Tranversal
// preOrder
void preOrder( Node *node = root )
{

if( !root )
cout << "\nBuat tree terlebih dahulu!!" << endl;
else{

if( node != NULL ){


cout << node->label << ", ";
preOrder(node->left);
preOrder(node->right);
}

// inOrder
void inOrder( Node *node = root )
{

if( !root )
cout << "\nBuat tree terlebih dahulu!!" << endl;
else{

if( node != NULL ){


inOrder(node->left);
cout << node->label << ", ";
inOrder(node->right);
}

// postOrder
void postOrder( Node *node = root )
{

if( !root )
cout << "\nBuat tree terlebih dahulu!!" << endl;
else{

if( node != NULL ){


postOrder(node->left);
postOrder(node->right);
cout << node->label << ", ";
}

// deleteTree
void deleteTree( Node *node )
{

if( !root )
cout << "\nBuat tree terlebih dahulu!!" << endl;
else{

if( node != NULL ){


if( node != root ){
node->parent->left = NULL;
node->parent->right = NULL;
}
deleteTree(node->left);
deleteTree(node->right);

if( node == root ){


delete root;
root = NULL;
}else{
delete node;
}
}

// delete Sub
void deleteSub(Node *node){
if( !root )
cout << "\nBuat tree terlebih dahulu!!" << endl;
else{
deleteTree(node->left);
deleteTree(node->right);
cout << "\nSubtree node " << node->label << " berhasil dihapus." << endl;
}
}

// clear
void clear(){
if( !root )
cout << "\nBuat tree terlebih dahulu!!" << endl;
else{
deleteTree(root);
cout << "\nTree berhasil dihapus." << endl;
}
}

// size
int size(Node *node = root){
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
return 0;
}else{

if( !node ){
return 0;
}else{
return 1 + size( node->left ) + size(node->right);
}

}
}

// height
int height( Node *node = root )
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
return 0;
}else{
if( !node ){
return 0;
}else{
int heightKiri = height( node->left );
int heightKanan = height( node->right );

if( heightKiri >= heightKanan ){


return heightKiri + 1;
}else{
return heightKanan + 1;
}

}
}
}

// characteristic
void charateristic()
{
cout << "\nSize Tree : " << size() << endl;
cout << "Height Tree : " << height() << endl;
cout << "Average Node of Tree : " << size() / height() << endl;
}

int main()
{

createNewTree('A');

Node *nodeB, *nodeC, *nodeD, *nodeE, *nodeF, *nodeG, *nodeH, *nodeI, *nodeJ;

nodeB = insertLeft('B', root);


nodeC = insertRight('C', root);
nodeD = insertLeft('D', nodeB);
nodeE = insertRight('E', nodeB);
nodeF = insertLeft('F', nodeC);
nodeG = insertLeft('G', nodeE);
nodeH = insertRight('H', nodeE);
nodeI = insertLeft('I', nodeG);
nodeJ = insertRight('J', nodeG);

cout << "Tree empty? : " << empty() << endl;

update('Z', nodeC);
update('C', nodeC);

retrieve(nodeC);

find(nodeC);

cout << "\nPreOrder :" << endl;


preOrder(nodeE);
cout << "\n" << endl;
cout << "InOrder :" << endl;
inOrder(nodeE);
cout << "\n" << endl;
cout << "PostOrder :" << endl;
postOrder(nodeE);
cout << "\n" << endl;

charateristic();

deleteSub(nodeE);
cout << "\nPreOrder :" << endl;
preOrder();
cout << "\n" << endl;

charateristic();

b. Output
1. Pembuatan Pohon dan Penambahan Node:
 Sebuah pohon dimulai dengan node 'A' sebagai root.
 Beberapa node lain ('B', 'C', dst.) ditambahkan sebagai anak kiri atau kanan dari node
tertentu.
2. Cek Ketersediaan Tree: Dilakukan pengecekan apakah pohon kosong atau tidak ('Tree empty?').

3. Pengubahan Label Node: Dilakukan pengubahan label node dari 'C' menjadi 'Z', lalu kembali ke
'C'.

4. Retrieve & Find Node: Operasi untuk mengambil label dari suatu node tertentu ('Retrieve') dan
menampilkan informasi tentang node tersebut ('Find'), seperti label node itu sendiri, root node,
parent node, saudara node, anak kiri, dan anak kanan.

5. Traversal (Penelusuran): Tiga metode penelusuran digunakan: preOrder, inOrder, dan postOrder.
Ini adalah cara berbeda untuk menelusuri semua node dalam pohon dan menampilkan labelnya.

6. Karakteristik Pohon: Menampilkan informasi tentang pohon seperti ukuran pohon (jumlah total
node), tinggi pohon, dan rata-rata node per tinggi pohon.

7. Penghapusan Subtree dan Pengecekan Setelah Penghapusan:


 Melakukan penghapusan subtree yang dimulai dari node 'E', sehingga semua node di
bawahnya dihapus.
 Menampilkan hasil dari operasi penghapusan subtree.
 Kemudian menampilkan kembali informasi tentang pohon, termasuk ukuran dan tinggi
setelah penghapusan subtree dilakukan.

4. KESIMPULAN DAN SARAN


Pohon pencarian biner (BST) menyediakan struktur data yang serbaguna dan efisien untuk
mengatur, mencari, dan mengambil data. Struktur sekuensialnya memungkinkan pencarian
yang efisien dan memastikan hubungan yang jelas antar elemen data.

Anda mungkin juga menyukai