TREE Oleh : Neny silvia Nurhidayah Afny wilujeng Setyorini Ika Khoirun N. Indah Nur alifia
TREE merupakan salah satu bentuk struktur data tidak linear yang menggambarkan hubungan yang bersifat hierarkis (hubungan one to many) antara elemen-elemen. Tree secara bentuk menyerupai sebuah pohon, yang terdiri dari serangkaian Node (simpul) yangsaling berhubungan. Sesuai konvensi ilmu komputer, tree bertumbuh ke bawah, tidak sepertipohon di dunia nyata yang tumbuh ke atas
Structur Tree Root adalah node yang memiliki hirarki tertinggi. Semua node dapat ditelusuri dari root. R ,S dan T adalah Internal Node Level dari sebuah node adalah ukuran jarak node tersebut terhadap akar X merupakan node induk(parent) dari Y dan Z Y dan Z merupakan node anak (Child) dari X Node yang dibawah Root adalah Subtree(cabang). leaf (daun) adalah Sebuah node yang tidak memiliki anak.
ISTILAH DALAM TREE Prodecessor : node yang berada diatas node tertentu. Successor : node yang berada di bawah node tertentu. Ancestor : seluruh node yang terletak sebelum node tertentu dan terletak pada jalur yang sama. Descendant : seluruh node yang terletak sesudah node tertentu dan terletak pada jalur yang sama. Parent : predecssor satu level di atas suatu node. Child : successor satu level di bawah 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. Height : banyaknya tingkatan/level dalam suatu tree. Root : satu-satunya node khusus dalam tree yang tak punya predecssor. Leaf : node-node dalam tree yang tak memiliki seccessor. Degree : banyaknya child yang dimiliki suatu node.
Binary Tree Deklarasi Tree Suatu tree dimana tiap node hanya boleh memiliki maksimal dua subtree dan kedua subtree tersebut harus terpisah. Pada pohon biner, umumnya kedua node anak disebut dengan posisinya, yaitu Kiri dan kanan . Deklarasi Tree struct node { int data; //menyimpan nilai node struct node *left; struct node *right;}; // kiri dan kanan bertipe left right label a a b c b c
Jenis binary tree: Full Binary Tree Complete Binary Tree Incomplete Binary Tree (Unbalanced Tree) Skewed Binary Tree
Full Binary Tree Semua node (kecuali leaf) memiliki nol atau 2 anak dan tiap subtree memiliki panjang path yang sama.
Complete Binary Tree mirip dengan full binary tree,tapi tiap subtree boleh memiliki panjang path yang berbeda dan tiap node (kecuali leaf) memiliki 2 anak Seluruh node pada level N-1 terisi seluruhnya dan pada level N node yangkosong adalah node kanan
Full Binary Tree Binary tree yang semua nodenya (kecuali leaf) hanya memiliki satu anak.
Operasi-operasi pada Tree Create: membentuk sebuah tree baru yang kosong. Clear: menghapus semua elemen tree. Empty: mengetahui apakah tree kosong atau tidak. Insert: menambah node ke dalam Tree secara rekursif. Find: mencari node di dalam Tree secara rekursif sampai node tersebut ditemukan dengan menggunakan variable bantuan ketemu. Syaratnya adalah tree tidak boleh kosong. Traverse: yaitu operasi kunjungan terhadap node-node dalam pohon dimana masing-masing node akan dikunjungi sekali. Count: menghitung jumlah node dalam Tree Height : mengetahui kedalaman sebuah Tree Find Min dan Find Max : mencari nilai terkecil dan terbesar pada Tree Child : mengetahui anak dari sebuah node (jika punya)
Menambahkan Node Pada Tree 1. Jika pohon kosong, maka node baru ditempatkan sebagai akar pohon 2. Jika pohon tidak kosong, maka dimulai dari node akar, dilakukan proses pengecekan berikut: a. Jika nilai node baru lebih kecil dari nilai node yang sedang dicek, maka lihat ke kiri node tersebut. Jika kiri node tersebut kosong (belum memiliki kiri), maka node baru menjadi kiri node yang sedang dicek. Seandainya kiri node sudah terisi, lakukan kembali pengecekan a dan b terhadap node kiri tersebut. Pengecekan ini dilakukan seterusnya hingga node baru dapat ditempatkan. 5 Menambahkan node baru nilai 5 : 10 6 8 5 3
b. Jika nilai node baru lebih besar dari nilai node yang sedang dicek, maka lihat ke kanan nodet ersebut. Jika kanan node tersebut kosong (belum memiliki kanan), maka node baru menjadikanan node yang sedang dicek. Seandainya kanan node sudah terisi, lakukan kembali pengecekan a dan b terhadap node kanan tersebut. Pengecekan ini dilakukan seterusnya hingga node baru dapat ditempatkan 11 Menambahkan node baru nilai 11 : 10 6 8 5 3 11
Proses penambahan ini diimplementasikan secara rekursif pada fungsi berikut: Variabel **root menunjukkan node mana yang sedang dicek saat ini, untuk itu saat pemanggilanfungsi ini, variabel **root kita beri nilai pointer yang menunjuk ke node akar, yaitu pohon
Membaca dan Menampilkan Node Pada Tree Untuk membaca dan menampilkan seluruh node yang terdapat pada pohon biner, terdapat 3 macam cara, atau yang biasa disebut kunjungan (visit). Kunjungan Pre-Order Kunjungan In-Order Kunjungan Post-Order
1.Kunjungan Pre-Order Kunjungan pre-order dilakukan mulai dari akar pohon, dengan urutan: Cetak isi (data) node yang sedang dikunjungi Kunjungi kiri node tersebut Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan untuk kiri tersebut. Jika kiri kosong (NULL), lanjut ke langkah ketiga. 3. Kunjungi kanan node tersebut, Jika kanan bukan kosong (tidak NULL ) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut. Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan proses yang samauntuk node yang dikunjungi sebelumnya.
2.Kunjungan In-Order 1.Kunjungi kiri node tersebut, Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan untuk kiritersebut. Jika kiri kosong (NULL), lanjut ke langkah kedua. 2. Cetak isi (data) node yang sedang dikunjungi 3. Kunjungi kanan node tersebut, Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut. Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan proses yang samauntuk node yang dikunjungi sebelumnya.
3.Kunjungan Post-Order 1. Kunjungi kiri node tersebut, •Jika kiri bukan kosong (tidak NULL ) mulai lagi dari langkah pertama, terapkan untuk kiri tersebut. •Jika kiri kosong ( NULL), lanjut ke langkah kedua. 2. Kunjungi kanan node tersebut, •Jika kanan bukan kosong (tidak NULL ) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut. •Jika kanan kosong (NULL), lanjut ke langkah ketiga. 3. Cetak isi (data) node yang sedang dikunjungi. Proses untuk node ini selesai, tuntaskan proses yang sama untuk node yang dikunjungi sebelumnya GDBHIEFCA
Searching in Tree Pencarian dilakukan secara rekursif, dimulai dari node root, jika data yang dicari lebih kecil daripada data node root, maka pencarian dilakukan di sub node sebelah kiri, sedangkan jika data yang dicari lebih besar daripada data node root, maka pencarian dilakukan di sub node sebelah kanan, jika data yang dicari sama dengan data suatu node berarti kembalikan node tersebut dan berarti data ditemukan.
Keterangan Searching Root = 6 dan 8 > 6, maka akan dicari di sub node bagian kanan root. Root = 10 dan 8 < 10, maka akan dicari di sub node bagian kiri root. Root = 7 dan 8 > 7, maka akan dicari di sub node bagian kanan root. Root = 8, berarti 8 = 8, maka akan dikembalikan node tersebut dan dianggap ketemu!
Jumlah Node Tree Penghitungan jumlah node dalam tree dilakukan dengan cara mengunjungi setiap node, dimulai dari root ke subtree kiri, kemudian ke subtree kanan dan masing-masing node dicatat jumlahnya, dan terakhir jumlah node yang ada di subtree kiri dijumlahkan dengan jumlah node yang ada di subtree kanan ditambah 1 yaitu node root.
Kedalaman (height) Node Tree Penghitungan kedalaman dihitung dari setelah root, yang dimulai dari subtree bagian kiri kemudian ke subtree bagian kanan. Untuk masing-masing kedalaman kiri dan kanan akan dibandingkan, jika ternyata subtree kiri lebih dalam, maka yang dipakai adalah jumlah kedalaman subtree kiri, demikian sebaliknya. Hal ini didasarkan pada prinsip binary tree, dimana tree-nya selalu memiliki maksimal 2 node anak.
Sekian