Anda di halaman 1dari 47

LAPORAN PRAKTIKUM

STRUKTUR DATA DAN ALGORITME

MODUL IX
“TREE”

Disusun oleh :
Nama : Muhammad Husni
Nim: 21102227

Dosen Pengampu :
Muhammad Afrizal Amrustian, S.kom., M.kom

PROGRAM STUDI TEKNIK INFORMATIKA


FAKULTAS INFORMATIKA
INSTITUT TEKNOLOGI TELKOM PURWOKERTO
PURWOKERTO
2022
KATA PENGANTAR

Assalamu’alaikum warahmatullahi wabarakatuh

Segala puji bagi Allah SWT yang telah memberikan kami kemudahan sehingga
saya dapat menyelesaikan laporan ini dengan tepat waktu. Tanpa pertolongan-Nya
tentunya saya tidak akan sanggup untuk menyelesaikan laporan ini dengan baik.
Shalawat serta salam semoga terlimpah curahkan kepada baginda tercinta kita yaitu
Nabi Muhammad SAW yang kita nanti-natikan syafa’atnya di akhirat nanti.

Saya mengucapkan syukur kepada Allah SWT atas limpahan nikmat sehat-
Nya, baik itu berupa sehat fisik maupun akal pikiran, sehingga saya mampu untuk
menyelesaikan pembuatan laporan kesembilan ini.

Saya tentu menyadari bahwa laporan ini masih jauh dari kata sempurna dan
masih banyak terdapat kesalahan serta kekurangan di dalamnya. Untuk itu, Saya
mengharapkan kritik serta saran dari pembaca untuk laporan ini, Agar laporan ini
nantinya dapat menjadi laporan yang lebih baik lagi. Demikian, dan apabila terdapat
banyak kesalahan pada laporan ini penulis mohon maaf yang sebesar-besarnya.

Saya juga mengucapkan terima kasih kepada semua pihak khususnya kepada
Dosen dan Asisten Dosen yang telah membimbing saya dalam menulis laporan ini

Purwokerto, Juli 2022

Penulis
Muhammad Husni

ii
DAFTAR ISI

LAPORAN PRAKTIKUM .................................................................................... i


MODUL IX ............................................................................................................. i
KATA PENGANTAR ........................................................................................... ii
DAFTAR ISI ......................................................................................................... iii
BAB I ...................................................................................................................... 1
TUJUAN PRAKTIKUM .................................................................................. 1
BAB II .................................................................................................................... 2
DASAR TEORI ................................................................................................. 2
BAB III ................................................................................................................... 4
GUIDED ............................................................................................................. 4
1. Guided 1 .................................................................................................. 4
UNGUIDED ..................................................................................................... 14
1. Unguided 1 ............................................................................................ 14
2. Unguided 2 ............................................................................................ 24
3. Unguided 3 ............................................................................................ 34
BAB IV ................................................................................................................. 44
KESIMPULAN................................................................................................ 44

iii
BAB I
TUJUAN PRAKTIKUM

1. Mahasiswa mampu menjelaskan mengenai algoritma Tree


2. Mahasiswa mampu membuat dan mendeklarasikan struktur algoritma Tree
3. Mahasiswa mampu menerapkan dan mengimplementasikan algoritma Tree

1
BAB II
DASAR TEORI

Struktur pada tree (pohon) tidak linear seperti pada struktur linked list, stack,
dan queue. Setiap node pada tree mempunyai tingkatan, yaitu orang tua (parent)
dan anak (child). Struktur ini sebenarnya merupakan bentuk khusus dari struktur
tree yang lebih umum, setiap orang tua hanya memiliki dua anak sehingga disebut
pohon biner (binary tree), yaitu anak kiri dan anak kanan.

dibawah ini akan diuraikan istilah-istilah umum dalam tree.


• Predecessor : node yang berada di atas node tertentu
• Successor : node yang dibawah node tertentu
• Ancestor : seluruh node yang terletak sebelum node tertentu dan terletak sesudah
pada jalur yang sama
• Descendant : seluruh node yang terletak sesudah node tertentu dan terletak
sesudah pada jalur yang sama
• Parent : predecessor satu level diatas suatu node
• Child : successor satu level dibawah suatu node
• Sibling : node-node yang memiliki parent yang sama dengan suatu node
• Subtree : bagian dari tree yang berupa suatu node beserta descendantnya dan
memiliki semua karakteristik dari tree tersebut
• Size : banyaknya node dalam suatu tree

2
• Height : banyaknya tingkatan/level dalam suatu tree
• Root : satu-satunya node khusus dalam tree yang tidak mempunyai predecessor
• Leaf : node-node dalam tree yang tidak memiliki successor
• Degree : banyaknya child yang dimiliki suatu node

Tree merupakan salah satu bentuk struktur data tidak linear yang
menggambarkan hubungan yang bersifat hirarkis (hubungan one to many) antara
elemen-elemen. Tree dapat didefinisikan sebagai kumpulan simpul/node dengan
satu elemen khusus yang disebut root dan node, disebut sub tree/sub pohon atau
cabang. Sehingga secara sederhana pohon bisa didefinisikan sebagai kumpulan
elemen yang salah satu elemennya disebut dengan akar (root) dan elemen yang
lainnya (simpul), terpecah menjadi sejumlah himpunan yang saling tidak
berhubungan satu dengan yang lainnya. Binary Tree adalah tree dengan syarat
bahwa tiap node hanya boleh memiliki maksimal dua subtree dan kedua subtree
tersebut harus terpisah. Maka tiap node dalam binary tree hanya boleh memiliki
paling banyak dua child.

Sumber1 : https://bundet.com/d/682-mengenal-algoritma-tree-pohon Diakses


pada tanggal 4 Juli
Sumber2 : https://sugengsiiswanto.blogspot.com/2013/12/menampilkan-node-
baru-tree-struktur.html Diakses pada tanggal 4 Juli

3
BAB III
GUIDED

1. Guided 1
Source Code

#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{

4
// 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;

5
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 )
{

6
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

7
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 )
{

8
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{

9
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{

10
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);

11
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();
}

Screenshoot Program

12
Deskripsi Program
Pada program ini membuat program TREE dengan menampilkan PreeOrder,
InOrder, PostOrder. Pada fungsi bool empty berfungsi untuk memeriksa apakah
binary tree masih kosong. Pada fungsi void update() berfungsi untuk mengubah
isi dari node yang ditunjuk oleh pointer. Pada fungsi void retrieve() berfungsi
untuk mengetahui isi dari node yang ditunjuk oleh pointer. Pada fungsi void
find() berfungsi untuk mencari root, parent, left child, atau right child dari suatu
node. Pada fungsi void deletesub() berfungsi untuk menghapus sebuah subtree
(node beserta seluruh descedantnya). Pada fungsi void clear() berfungsi untuk
mengosongkan binary tree yang sudah ada. Pada fungsi void charateristic()
berfungsi untuk mengetahui karakteristik dari suatu tree, yaitu : size, height,
serta average lengthnya.

13
UNGUIDED

1. Unguided 1
Source Code

#include <iostream>
using namespace std;

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

// variabel pointer global


Node *root, *newNode;

// create New Tree


void createNewTree( string 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( string label, Node *node )
{
if( root == NULL ){

14
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( string 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{

15
// 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(string label, Node *node)
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
}else{
if( !node )
cout << "\nNode yang ingin diganti tidak ada!!" << endl;
else{
string temp = node->label;
node->label = label;
cout << "\nLabel node " << temp << " berhasil diubah menjadi " <<
label << endl;
}
}
}

16
// 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;

17
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);
}
}
}

18
// 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;
}
}
}
}

19
// 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;

20
}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("Lutfi");
Node *nodeB, *nodeC, *nodeD, *nodeE, *nodeF, *nodeG, *nodeH,
*nodeI, *nodeJ;
nodeB = insertLeft("Zulfian", root);
nodeC = insertRight("Teknik", root);
nodeD = insertLeft("Informatika", nodeB);
nodeE = insertRight("Institut", nodeB);
nodeF = insertLeft("Teknologi", nodeC);
nodeG = insertLeft("Telkom", nodeE);
nodeH = insertRight("Purwokerto", nodeE);
nodeI = insertLeft("Jawa Tengah", nodeG);
nodeJ = insertRight("Indonesia", nodeG);
cout << "Tree empty? : " << empty() << endl;
update("Tecno", nodeC);
update("Logi", nodeC);

retrieve(nodeC);

21
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(nodeJ);
cout << "\nPreOrder :" << endl;
preOrder();
cout << "\n" << endl;
charateristic();
}

Screenshoot Program

22
Deskripsi Program
Pada program ini membuat program TREE dengan menampilkan PreeOrder,
InOrder, PostOrder. Pada program unguided 1 ini merubah isi node dari kode
guided 1, dari char menjadi string. Pada fungsi bool empty berfungsi untuk
memeriksa apakah binary tree masih kosong. Pada fungsi void update()
berfungsi untuk mengubah isi dari node yang ditunjuk oleh pointer. Pada fungsi
void retrieve() berfungsi untuk mengetahui isi dari node yang ditunjuk oleh
pointer. Pada fungsi void find() berfungsi untuk mencari root, parent, left child,
atau right child dari suatu node. Pada fungsi void deletesub() berfungsi untuk
menghapus sebuah subtree (node beserta seluruh descedantnya). Pada fungsi
void clear() berfungsi untuk mengosongkan binary tree yang sudah ada. Pada
fungsi void charateristic() berfungsi untuk mengetahui karakteristik dari suatu
tree, yaitu : size, height, serta average lengthnya.

23
2. Unguided 2
Source Code

#include <iostream>
using namespace std;
// node
struct Node{
int label;
Node *left, *right, *parent;
};
// variabel pointer global
Node *root, *newNode;
// create New Tree
void createNewTree( int 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( int 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{

24
// 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( int 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;

25
}
}
}
// Empty
bool empty()
{
if( root == NULL )
return true;
else
return false;
}
// update
void update(int label, Node *node)
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
}else{
if( !node )
cout << "\nNode yang ingin diganti tidak ada!!" << endl;
else{
int 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;
}
}
}

26
// 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;
}
}
}

27
// 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 << ", ";
}
}
}

28
// 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 )

29
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;
}
}
}
}

30
// characteristic
void charateristic()
{
cout << "\nSize Tree : " << size() << endl;
cout << "Height Tree : " << height() << endl;
cout << "Average Node of Tree : " << size() / height() << endl;
}
int main()
{
createNewTree(2);
Node *nodeB, *nodeC, *nodeD, *nodeE, *nodeF, *nodeG, *nodeH,
*nodeI, *nodeJ;
nodeB = insertLeft(3, root);
nodeC = insertRight(4, root);
nodeD = insertLeft(5, nodeB);
nodeE = insertRight(6, nodeB);
nodeF = insertLeft(7, nodeC);
nodeG = insertLeft(8, nodeE);
nodeH = insertRight(9, nodeE);
nodeI = insertLeft(10, nodeG);
nodeJ = insertRight(11, nodeG);
cout << "Tree empty? : " << empty() << endl;
update(12, nodeC);
update(4, nodeC);
retrieve(nodeC);
find(nodeC);
cout << "\nPreOrder :" << endl;
preOrder(nodeE);
cout << "\n" << endl;
cout << "InOrder :" << endl;
inOrder(nodeE);
cout << "\n" << endl;
cout << "PostOrder :" << endl;

31
postOrder(nodeE);
cout << "\n" << endl;
charateristic();
deleteSub(nodeJ);
cout << "\nPreOrder :" << endl;
preOrder();
cout << "\n" << endl;
charateristic();
}

Screenshoot Program

32
Deskripsi Program
Pada program ini membuat program TREE dengan menampilkan PreeOrder,
InOrder, PostOrder. Pada program unguided 2 ini menggunakan tipe data
integer. Pada fungsi bool empty berfungsi untuk memeriksa apakah binary tree
masih kosong. Pada fungsi void update() berfungsi untuk mengubah isi dari node
yang ditunjuk oleh pointer. Pada fungsi void retrieve() berfungsi untuk
mengetahui isi dari node yang ditunjuk oleh pointer. Pada fungsi void find()
berfungsi untuk mencari root, parent, left child, atau right child dari suatu node.
Pada fungsi void deletesub() berfungsi untuk menghapus sebuah subtree (node
beserta seluruh descedantnya). Pada fungsi void clear() berfungsi untuk
mengosongkan binary tree yang sudah ada. Pada fungsi void charateristic()
berfungsi untuk mengetahui karakteristik dari suatu tree, yaitu : size, height,
serta average lengthnya.

33
3. Unguided 3
Source Code

#include <iostream>

using namespace std;

// node
struct Node{
float label;
Node *left, *right, *parent;
};
// variabel pointer global
Node *root, *newNode;
// create New Tree
void createNewTree( float 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( float 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

34
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( float 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;

35
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(float label, Node *node)
{
if( !root ){
cout << "\nBuat tree terlebih dahulu!!" << endl;
}else{
if( !node )
cout << "\nNode yang ingin diganti tidak ada!!" << endl;
else{
int 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;

36
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;

37
}
}
}
// 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);

38
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;
}
}

39
// 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;

40
}
}
}
}
// characteristic
void charateristic()
{
cout << "\nSize Tree : " << size() << endl;
cout << "Height Tree : " << height() << endl;
cout << "Average Node of Tree : " << size() / height() << endl;
}
int main()
{
createNewTree(1.1);
Node *nodeB, *nodeC, *nodeD, *nodeE, *nodeF, *nodeG, *nodeH,
*nodeI, *nodeJ;
nodeB = insertLeft(2.2, root);
nodeC = insertRight(3.3, root);
nodeD = insertLeft(4.4, nodeB);
nodeE = insertRight(5.5, nodeB);
nodeF = insertLeft(6.6, nodeC);
nodeG = insertLeft(7.7, nodeE);
nodeH = insertRight(8.8, nodeE);
nodeI = insertLeft(9.9, nodeG);
nodeJ = insertRight(10.10, nodeG);
cout << "Tree empty? : " << empty() << endl;
update(11.11, nodeC);
update(3.3, nodeC);
retrieve(nodeC);
find(nodeC);
cout << "\nPreOrder :" << endl;
preOrder(nodeE);
cout << "\n" << endl;
cout << "InOrder :" << endl;
inOrder(nodeE);
cout << "\n" << endl;
cout << "PostOrder :" << endl;

41
postOrder(nodeE);
cout << "\n" << endl;
charateristic();
deleteSub(nodeJ);
cout << "\nPreOrder :" << endl;
preOrder();
cout << "\n" << endl;
charateristic();
}

Screenshoot Program

42
Deskripsi Program
Pada program ini membuat program TREE dengan menampilkan PreeOrder,
InOrder, PostOrder. Pada program unguided 3 ini menggunakan tipe data float.
Pada fungsi bool empty berfungsi untuk memeriksa apakah binary tree masih
kosong. Pada fungsi void update() berfungsi untuk mengubah isi dari node yang
ditunjuk oleh pointer. Pada fungsi void retrieve() berfungsi untuk mengetahui isi
dari node yang ditunjuk oleh pointer. Pada fungsi void find() berfungsi untuk
mencari root, parent, left child, atau right child dari suatu node. Pada fungsi void
deletesub() berfungsi untuk menghapus sebuah subtree (node beserta seluruh
descedantnya). Pada fungsi void clear() berfungsi untuk mengosongkan binary
tree yang sudah ada. Pada fungsi void charateristic() berfungsi untuk
mengetahui karakteristik dari suatu tree, yaitu : size, height, serta average
lengthnya.

43
BAB IV
KESIMPULAN

Pada praktikum kesembilan ini diajarkan tentang materi Tree. Struktur pada
tree (pohon) tidak linear seperti pada struktur linked list, stack, dan queue. Setiap
node pada tree mempunyai tingkatan, yaitu orang tua (parent) dan anak (child).
Struktur ini sebenarnya merupakan bentuk khusus dari struktur tree yang lebih
umum, setiap orang tua hanya memiliki dua anak sehingga disebut pohon biner
(binary tree), yaitu anak kiri dan anak kanan. Traverse yaitu mengunjungi seluruh
node pada tree. Hasilnya adalah urutan informasi secara linear yang tersimpan
dalam tree. Ada tiga cara traverse :
• Pre Order : Cetak isi node yang dikunjungi, kunjungi Left Child, kunjungi Right
Child.
• InOrder : Kunjungi Left Child, cetak isi node yang dikunjungi,kunjungi.
• Right Child. PostOrder : Kunjungi Left Child, kunjungi Right Child, cetak isi
node yang dikunjungi.

44

Anda mungkin juga menyukai