TREE DAN GRAF


1.      PENGERTIAN TREE
Kumpulan node yang saling terhubung satu sama lain dalam suatu  kesatuan yang
membentuk layakya struktur sebuah pohon. Struktur pohon adalah suatu  cara
merepresentasikan suatu struktur hirarki (one-to-many) secara grafis yang mirip
sebuah pohon, walaupun pohon tersebut  hanya tampak sebagai kumpulan node-node  dari atas ke bawah. Suatu struktur data yang tidak linier yang
menggambarkan  hubungan yang hirarkis (one-to-many) dan tidak linier antara
elemen-elemennya.
Deklarasi Pohon
Jika kita memperhatikan setiap simpul dalam pohon biner, kita bisa menyusun  struktur data yang tepat dari simpul-simpul tersebut. Kita dapat melihat bahwa dalam  setiap simpul selalu berisi dua buah pointer untuk menunjuk ke cabang kiri dan cabang  kanan, dan informasi yang akan disimpan dalamsimpul tersebut. Dengan memperhatikan hal ini, simpul dalam pohon biner disajikan sebagai berikut:



Sesuai dengan gambar 7.1, maka deklarasi list yang sesuai adalah:
 
typedef char TypeInfo;
typedef struct Simpul *Tree;
struct Simpul {
TypeInfo Info;
tree Kiri, /* cabang kiri */
Kanan; /* cabang kanan */
};
 

ISTILAH DALAM TREE

JENIS-JENIS TREE BINARY TREE
Tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal dua sub
pohon dan kedua subpohon harus terpisah.
Kelebihan struktur Binary Tree :
- Mudah dalam penyusunan algoritma sorting
- Searching data relatif cepat
- Fleksibel dalam penambahan dan penghapusan data




KUNJUNGAN PADA POHON BINER
Sebuah pohon biner memiliki operasi  traversal  yaitu suatu kunjungan pada
suatu simpul tepat satu kali. Dengan melakukan kunjungan lengkap kita akan
memperoleh urutan informasi secara linier yang tersinpan di dalam pohon biner.
Terdapat tiga jenis kunjungan pada pohon biner, yaitu :
PREORDER
Kunjungan jenis ini mempunyai urutan kunjungan sebagai berikut :
–  Cetak isi simpul yang dikunjungi.
–  Kunjungi cabang kiri.
–  Kunjungi cabang kanan.
Prosedur untuk melakukan traversal secara PREORDER adalah sebagai berikut:



INORDER
Kunjungan jenis ini mempunyai urutan kunjungan sebagai berikut :
–  Kunjungi cabang kiri.
–  Cetak isi simpul yang dikunjungi.
–  Kunjungi cabang kanan.
Prosedur untuk melakukan traversal secara INORDER adalah sebagai berikut:


POSTORDER
Kunjungan jenis ini mempunyai urutan kunjungan sebagai berikut :
–  Kunjungi cabang kiri.
–  Kunjungi cabang kanan.
–  Cetak isi simpul yang dikunjungi

Contoh Program:
#include<stdio.h>//header file
#include<conio.h>
/* Deklarasi struct */
typedef struct Node{
      int data;    //data pada tree
      Node *kiri;  //penunjuk node anak kiri
      Node *kanan; //penunjuk node anak kanan
};
/* Fungsi untuk memasukkan data ke dalam tree */
void tambah(Node **root, int databaru){
      if((*root) == NULL){       //jika pohon/subpohon masih kosong
            Node *baru;//node “baru” dibentuk…
            baru = new Node;//berdasarkan struct “Node”
            baru->data = databaru; //data node baru diisi oleh variabel databaru
            baru->kiri = NULL;//penunjuk kiri node baru masih kosong
            baru->kanan = NULL;//penunjuk kanan node baru masih kosong
            (*root) = baru; //node pohon (root) diletakkan pada node baru
            (*root)->kiri = NULL;//penunjuk kiri node root masih kosong
            (*root)->kanan = NULL; //penunjuk kanan node root masih kosong
            printf(“Data bertambah!”);
      }
      else if(databaru < (*root)->data)//jika databaru kurang dari data node root…
            tambah(&(*root)->kiri, databaru);//tambahkan databaru pada subpohon kiri
      else if(databaru > (*root)->data)//jika databaru lebih dari data node root…
            tambah(&(*root)->kanan, databaru); //tambahkan databaru pada subpohon kanan
      else if(databaru == (*root)->data)//jika databaru sama dengan data node root
            printf(“Data sudah ada!”);//databaru tidak dapat ditambahkan pada tree
}
/* Fungsi untuk menampilkan data secara pre-order
   (data ditampilkan dari node induk, node anak kiri, lalu node anak kanan)
*/
void preOrder(Node *root){
      if(root != NULL){//jika pohon/subpohon tidak kosong
            printf(“%d “, root->data);//menampilkan data node yang dikunjungi
      preOrder(root->kiri);//mengunjungi node anak kiri
      preOrder(root->kanan); //mengunjungi node anak kanan
      }
}
/* Fungsi untuk menampilkan data secara in-order
   (data ditampilkan dari node anak kiri, node induk, lalu node anak kanan)
*/
void inOrder(Node *root){
      if(root != NULL){//jika pohon/subpohon tidak kosong…
      inOrder(root->kiri);//mengunjungi node anak kiri
      printf(“%d “, root->data);//menampilkan data node yang dikunjungi
      inOrder(root->kanan);//mengunjungi node anak kanan
      }
}
              
/* Fungsi untuk menampilkan data secara post-order
   (data ditampilkan dari node anak kiri, node anak kanan, lalu node induk)
*/
void postOrder(Node *root){
     if(root != NULL){//jika pohon/subpohon tidak kosong
     postOrder(root->kiri); //mengunjungi node anak kiri
     postOrder(root->kanan);//mengunjungi node anak kanan
     printf(“%d “, root->data); //menampilkan data node yang dikunjungi
     }
}
main(){
     int pil, c;
     Node *pohon, *t;
     pohon = NULL;
     do{
           int data;
           printf(“MENU\n”);
           printf(“1. Tambah\n”);
           printf(“2. Lihat Pre-Order\n”);
           printf(“3. Lihat In-Order\n”);
           printf(“4. Lihat Post-Order\n”);
           printf(“5. Exit\n”);
           printf(“Pilihan : “); scanf(“%d”, &pil);
           switch(pil){
           case 1 :
                printf(“Data baru : “);
                scanf(“%d”, &data);
                tambah(&pohon, data);
                break;
           case 2 :
                if(pohon != NULL)
                     preOrder(pohon);
                else
                     printf(“Masih kosong!”);
                break;
           case 3 :
                if(pohon != NULL)
                     inOrder(pohon);
                else
                      printf(“Masih kosong!”);
                break;
           case 4 :
                if(pohon != NULL)
                     postOrder(pohon);
                else
                     printf(“Masih kosong!”);
                break;
           }
           getch();
           printf(“\n”);
     }
     while(pil != 5);
}
 

Hasil:

2.      PENGERTIAN GRAPH
Graph adalah himpunan verteks dan himpunan sisi (edge). keterhubungan antara verteks. Biasanya untuk suatu graph G digunakan notasi matematis. Verteks menyatakan entitas-entitas data dan sisi menyatakan G = (V, E) Dimana :
G= Graph
V= Simpul atau Vartex, atau Node, atau Titik
E= Busur atau Edge, atau Edge, atau arc
              V adalah himpunan verteks dan E himpunan sisi yang terdefinisi antara pasangan-pasangan verteks. Sebuah sisi antara verteks x dan y ditulis {x,y}. Suatu graph H = (V1, E1) disebut subgraph dari graph G jika V1 adalah himpunan bagian dari V dan E1 himpunan bagian dari E. Cara pendefinisian lain untuk graph adalah dengan menggunakan himpunan keterhubungan langsung Vx. Pada setiap verteks x terdefinisi Vx sebagai himpunan dari verteks-verteks yang adjacent dari. Dalam digraph didefinisikan juga terminologi-terminologi berikut ini.Predesesor dari suatu verteks x (ditulis Pred(x)) adalah himpunan semua vertex yang adjacent ke x. Suksesor dari verteks x (ditulis Succ(x)) adalah himpunan. Struktur data bergantung pada struktur graph dan algoritma yang digunakan untuk memmanipulasi graph. Secara teori salah satu dari keduanya dapat dibedakan antara struktur list dan matriks, tetapi dalam penggunaannya struktur terbaik yang sering digunakan adalah kombinasi keduanya.
Kemudian terdapat istilah-istilah yang berkaitan dengan graph yaitu:
1.      Vertex Adalah himpunan node / titik pada sebuah graph.
2.      Edge Adalah himpunan garis yang menghubungkan tiap node / vertex
3.      Adjacent Adalah dua buah titik dikatakan berdekatan (adjacent) jika dua buah titik tersebut terhubung dengan sebuah sisi. Adalah Sisi e3 = v2v3 insident dengan titik v2 dan titik v3, tetapi sisi e3 = v2v3 tidak insident dengan titik v1 dan titik v4. Titik v1 adjacent dengan titik v2 dan titik v3, tetapi titik v1 tidak adjacent dengan titik v4.
4.      Weight Adalah Sebuah graf G = (V, E) disebut sebuah graf berbobot (weight graph), apabila terdapat sebuah fungsi bobot bernilai real W pada himpunan E, nilai W (e) disebut bobot untuk sisi e, " e Î E. Graf berbobot tersebut dinyatakan pula sebagai G = (V, E, W).
5.      Path Adalah Walk dengan setiap vertex berbeda. Contoh, P = D5B4C2A Sebuah walk (W) didefinisikan sebagai urutan (tdk nol) vertex & edge. Diawali origin vertex dan diakhiri terminus vertex. Dan setiap 2 edge berurutan adalah series. Contoh, W = A1B3C4B1A2.
6.      Cycle Adalah Siklus (Cycle) atau Sirkuit (Circuit) Lintasan yang berawal dan berakhir pada simpul yang sama.

Komentar