Praktikum Struktur Data MODUL VIII POHON BINER 1. Maksud Tipe pointer untuk membuat Pohon 2. Tujuan Membuat program untuk implementasi pohon. 3. Teori 3.1. Pengertian pohon. Tree adalah kontainer non linier yang memodelkan suatu hubungan hirarkis di mana terdapat satu predesesor unik (parent) tetapi dapat memiliki banyak suksesor (children). Node yang tidak mempunyai suksesor disebut sebagai root dari tree. Elemen dari tree disebut node. Setiap node memiliki path yang unik yang menghubungkannya ke root dari tree. Path adalah rangkaian dari elemen yang berdampingan. Panjang path adalah jumlah koneksi yang berdampingan dan setidaknya satu lebih sedikit dari jumlah node yang dihubungkan. Pohon biner (binary tree) bisa kosong, atau terdiri dari satu node bernama root (akar) dengan dua pohon biner yang disebut subpohon kanan dan sub pohon kiri. Pohon pencarian biner (binary search tree) adalah pohon biner yang kosong ataupun yang dalam setiap node berisi kunci yang memenuhi syarat tertentu. Syarat pertama, semua kunci subtree kiri dari akar (jika ada) mendahului kunci pada akar. Kedua, kunci pada akar mendahului semua kunci (jika ada) pada subtree kanan. Ketiga, subtree kiri dan kanan dari akar juga merupakan pohon pencarian. 3.2. Deklarasi pohon typedef int Key_type; typedef struct item_tag { int key; int no; char *posisi; }Item_type; typedef struct node_tag { Item_type info; struct node_tag *kanan; struct node_tag *kiri; } Node_type; 31 3.3. Membuat pohon void CreateTree(Node_type *root) { root = NULL; } 3.4. Mengecek apakah pohon kosong bool TreeEmpty(Node_type *root) { return root==NULL; } 3.5. Membuat node baru Node_type *MakeNode(Item_type info) { Node_type *p=NULL; if ((p=(Node_type*)malloc(sizeof(Node_type)))==NULL) cout<<"Tidak ada tempat"; p->info.key=info.key; p->kiri=p->kanan=NULL; return p; } 3.6. Menambah node ke pohon Node_type *InsertTree(Node_type *root, Node_type *newnode) { Node_type *p=root; while (p!=NULL) { if (newnode->info.key < p->info.key) if (p->kiri) p=p->kiri; else {p->kiri = newnode; p->kiri->info.posisi=(char*)" kiri"; p->kiri->info.no=++nourut;break; } else if (newnode->info.key > p->info.key) if (p->kanan) p=p->kanan; else {p->kanan=newnode; p->kanan->info.posisi=(char*)" kanan"; p->kanan->info.no=++nourut;break; } else 32 { cout<<"Kunci duplikat"<<endl; p=NULL; } } newnode->kiri=newnode->kanan=NULL; if (root==NULL) { root=newnode; root->info.posisi=(char*)(" root"); root->info.no=++nourut; } return root; } 3.7. Membaca sebuah node void Visit(Node_type *p) { cout<<"("<<p->info.no<<":"<<p->info.key<<")";} 3.8. Mengunjungi pohon secara In Order void Inorder(Node_type *root, char *s) { if (root) { Inorder(root->kiri," Kiri"); cout<<s<<" ";Visit(root); Inorder(root->kanan," Kanan"); }else cout<<"("<<s<<" NULL)"<<endl; } 3.8. Mengunjungi pohon secara Pre Order void Preorder(Node_type *root, char *s) { if (root) { cout<<s<<" ";Visit(root); Preorder(root->kiri, " Kiri"); Preorder(root->kanan, " Kanan"); }else cout<<"("<<s<<" NULL)"<<endl; } 33 3.8. Mengunjungi pohon secara Post Order void Postorder(Node_type *root, char *s) { if (root) { Postorder(root->kiri," Kiri"); Postorder(root->kanan," Kanan"); cout<<s<<" ";Visit(root); } else cout<<"("<<s<<" NULL)"<<endl; } 3.8. Mencari node tertentu dalam pohon Node_type *TreeSearch(Node_type *p, Key_type target) { if (p) if (target < p->info.key) p = TreeSearch(p->kiri,target); else if (target > p->info.key) p = TreeSearch(p->kanan, target); return p; } 4. Praktek. Buatlah program lengkap untuk mengimplementasikan pohon biner 5. Tugas Tambahkan menu untuk menghapus node tertentu dalam pohon 34 DAFTAR PUSTAKA Indra, Erliansyah, Algoritma & Struktur Data dengan C++, Graha Ilmu, Yogyakarta, 2005. Kruse, Leung and Tondo, Data Structures and Program Design in C, Second Edition, Prentice Hall, 1997 35