Anda di halaman 1dari 10

LAPORAN PRAKTIKUM RESMI

TREE




Disusun oleh :
Christina Natalia Sunjaya
201301003

Dosen pengampu :
Yosef Murya Kusuma Ardhana.S.T., M.Kom



JURUSAN SISTEM INFORMASI
SEKOLAH TINGGI ILMU KOMPUTER YOS SUDARSO
PURWOKERTO
2014

BAB I

A. Pohon Biner (Binary Tree)
Pohon biner adalah sebuah tree yang pada masing-masing simpulnya hanya dapat
memiliki maksimum 2 simpul anak, tidak boleh lebih. Pada pohon biner, umumnya kedua node
anak (child) disebut dengan posisinya, yaitu subordinat kiri (left child) dan subordinat kanan
(right child).


Left right
Ada banyak cara dalam mengilustrasikan struktur sebuah node binary tree, namun yang paling
umum adalah ilustrasi seperti pada gambar diatas.
1. Pohon Biner dengan Depth 3 kedalaman (depth)=3












Ilustrasi pada gambar di atas merupakan contoh pohon biner dengan depth =3.










INFO
A
B
C
D
E F G
H
I
2. Stricly Binary Tree
Strictly binary tree adlaahee pohon biner yang semua node-nya (kecuali simpul leaf)
mempunyai lengkap node subordinat kiri dan node subordinat kanan.













Sebuah strucly binary tree bila mempunyai n leaf maka akan mempunyai 2n-1 buah node.
Perhatikan contoh gambar strictly binary tree di atas, maka dapat dihitung :
Jumlah leaf : 8
Jumlah node : 2*8-1=15
3. Completely Binary Tree
Completely binary tree dengan depth = d adalah pohon biner strictly binary tree, dimana
semua leaf hanya berada pada level d. maka , pada completely binary tree berlaku:
Pada level k jumlah node: n=2^k
Untuk tree dengan depth d, maka jumlah node...: n=2^(d+1)-1
Untuk tree dengan depth d, maka jumlah node leaf: n=2^d
Untuk tree dengan depth d, maka jumlah node bukan leaf..: n=(2^d)-1
Bila jumlag node seluruh node = n, maka depth tree adalah: d=log2(n+1)-1

Complete binary tree dengan depth = d, memiliki cirri-ciri :
Setiap node yang berawal di bawah d-1, memiliki dua subordinat.
Jika pada level d-1 subtree kanan nada node yang mempunyai subordinat, maka
setiap node pada level d-1 subtree kiri harus memiliki subordinat kiri dan kanan.
4. Balanced Binary Tree
Balanced binary tree (pohon biner seimbang) atau biasa disebut dengan pohon AVL
adalah pohon biner yang ketinggian subtree kiri dan subtree kanan untuk setiap node
superordinat paling banyak selisih 1.
Berikut ini adalah contoh Balance Binary Tree :


A
B
C
D
E
H I J K
F
G
L M N O










Balance Binary Tree
Unbalance Binary Tree
B. Penomoran Node Pohon Biner
Untuk melakukan konversi telah disepakati cara penomoran stiap node dalam binary tree
sebagai berikut :
Jika sebuah node bernomor n, maka subordinat kiri bernomor 2n dan subordinat
kanan bernomor 2n+1.
Node root diberi nomor 1.
Penomoran node binary tree dapat diilustrasikan seperti pada gambar berikut:

n 1 5


2n 2n+1 2 3 10 11
A
B

C
A
B
C
A
B C
A
B
C
D
E
H
I
J
K
F G
L M
Dengan mengetahui dari nomor setiap node maka sebuah binary tree dapat
direpresentasikan ke dalam sebuah array satu dimensi. Perhatikan contoh berikut ketika binary
tree direpresentasikan ke dalam array satu dimensi.

Level 0

Level 1
Level 2

Level 3

Dengan menggunakan penomoran di atas, maka untuk menyimpan sebuah binary tree
dengan depth = d, perlu disiapkan array satu dimensi dengan jumlah elemen minimal sebanyak
2^(d+1)-1 elemen
.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15
A B C D E F G H I
Untuk depth=d, maka perlu dipersiapkan array satu dimensi minimal 2^(d+1).
Contoh: untuk d=3 perlu dipersiapkan minimal 2^4=16 elemen. Misal dengan int A[16];








A
B
C
D E F
I G
H

BAB II
PENJELASAN PROGRAM
1. Latihan praktikum
/*
* praktikum2tree.cpp
*
* Created on: Sep 18, 2014
* Author: SAMSUNG
*/


#include <iostream>
#include <malloc.h>

#define Nil NULL
using namespace std;

struct nod{
struct nod *left;
char data;
struct nod *right;
};

typedef struct nod NOD;
typedef NOD POKOK;

NOD *NodBaru (char item){
NOD *n;
n=(NOD *)malloc(sizeof(NOD));
if(n!=Nil){
n->data=item;
n->left=Nil;
n->right=Nil;
}
return n;
}

void BinaPokok (POKOK **T){
*T=NULL;
}

typedef enum {FALSE=0, TRUE=1} BOOL;
BOOL PokokKosong (POKOK *T){
return ((BOOL)(T==Nil));
}

void TambahNod (NOD **p, char item){
NOD *n;
n=NodBaru(item);
*p=n;
}

void preOrder (POKOK *T){
if(!PokokKosong(T)){
cout<<" "<<T->data;
preOrder(T->left);
preOrder(T->right);
}
}

void inOrder (POKOK *T){
if(!PokokKosong(T)){
inOrder(T->left);
cout<<" "<<T->data;
inOrder(T->right);
}
}

void postOrder (POKOK *T){
if(!PokokKosong(T)){
postOrder(T->left);
postOrder(T->right);
cout<<" "<<T->data;
}
}

int main(){
POKOK *kelapa;
char buah;

BinaPokok(&kelapa);
TambahNod(&kelapa, buah='M');
TambahNod(&kelapa->left, buah='E');
TambahNod(&kelapa->left->right, buah='I');
TambahNod(&kelapa->left->right->right, buah='L');
TambahNod(&kelapa->right, buah='O');
TambahNod(&kelapa->right->left, buah='D');

cout<<"Tampilkansecarapre-Order\t: ";
preOrder(kelapa);

cout<<endl;
cout<<"Tampilkansecara in-Oreder\t: ";
inOrder(kelapa);

cout<<endl;
cout<<"Tampilkansecara post-Order\t: ";
postOrder(kelapa);

cout<<endl;
cout<<endl;

return 0;

}



Output program :

Penjelasan program :
1. Tanda yang diawali dengan /* dan diakhiri tanda */ adalah script untuk sebuah komentar
atau perintah / teks, namun jika program di run tidak akan dibaca oleh compiler, tidak
muncul di output.
2. #include adalah pengarah preprocessor yang berfungsi untuk menginstruksikan
compiler.
3. <iostream> adalah header atau library file untuk proses input output nantinya.
4. Using namespace std adalah penyingkatan sebuah kode.
5. Int main(){ adalah awalan dari sebuah main program yang akan di eksekusi. Di awali
dengan tanda buka kurung kurawal { dan di akhiri dengan tutup kurung kurawal } di
situlah body atau badan program.
6.
#define Nil NULL
using namespace std;
Nil berfungsi untuk menggantikan NULL, sedangkan define merupakan library untuk elemen
yang tidak ada di C++ Eclipse.

7.
struct nod{
struct nod *left;
char data;
struct nod *right;
};
Pendeklarasian struct nod, dengan pointer left dan right.
8.
typedef struct nod NOD;
typedef NOD POKOK;
Pendeklarasian tipe data baru dengan tipe data abstrak, di program ini kita menggunakan tipe
data abstrak typedef struct dan typedef.
9.
NOD *NodBaru (char item){
NOD *n;
n=(NOD *)malloc(sizeof(NOD));
if(n!=Nil){
n->data=item;
n->left=Nil;
n->right=Nil;
}
return n;
}
Prosedur NodBaru adalah untuk membuat node node yang baru.
10.
void BinaPokok (POKOK **T){
*T=NULL;
}

typedef enum {FALSE=0, TRUE=1} BOOL;
BOOL PokokKosong (POKOK *T){
return ((BOOL)(T==Nil));
}
Prosedur BinaPokok berisi pointer T. Sedangkan typedef enum berguna untuk dua kondisi
dimana false bernilai 0 dan true bernilai 1.
11.
void TambahNod (NOD **p, char item){
NOD *n;
n=NodBaru(item);
*p=n;
}

void preOrder (POKOK *T){
if(!PokokKosong(T)){
cout<<" "<<T->data;
preOrder(T->left);
preOrder(T->right);
}
}
Prosedur TambahNod berguna untuk pointer dimana nod adalah n.

12.
void inOrder (POKOK *T){
if(!PokokKosong(T)){
inOrder(T->left);
cout<<" "<<T->data;
inOrder(T->right);
}
}

void postOrder (POKOK *T){
if(!PokokKosong(T)){
postOrder(T->left);
postOrder(T->right);
cout<<" "<<T->data;
}
}
Prosedur inOrder dilakukan untuk mengunjungi simpul kiri lalu mencetak simpulnya
dan berkunjung ke simpul kanan. Sedangkan prosedur postOrder dilakukan untuk
mengunjungi simpul kiri lalu simpul kanan lalu mencetak simpulnya.
13.
POKOK *kelapa;
char buah;