Binary Trees 53 30 72 14 39 61 84 9 23 34 47 79 30 adalah parent Dari 14 dan 39 Level 0 Root 53 Garis putus-putus adalah path 14 adalah child kiri dari 30 30 72 Level 1 39 adalah child kanan dari 30 14 39 61 84 Level 2 9 23 34 47 79 Level 3 Subtree dengan 14 Sebagai root-nya
Terminologi Path Bayangkan seperti orang yang berjalan dari node ke node melalui garis yang menghubungkannya. Garis-garis penghubung yang delewati itulah yang dinamakan dengan path. Root Node pada posisi paling atas disebut root. Dalam sebuah tree hanya terdapat satu root saja. Parent Setiap node (kecuali root) mempunyai cabang yang menguhubungkan tepat satu node lain di atasnya. Node di atasnya inilah yang disebut parent. Child Setiap node bisa mempunyai satu atau lebih cabang yang menghubungkan ke node lainnya. Node di bawahnya inilah yang disebut dengan child.
Leaf Node yang tidak mempunyai child disebut dengan leaf. Dalam sebuah tree hanya ada satu root saja tetapi bisa mempunyai banyak leaf. Subtree Setiap node bisa dipertimbangkan menjadi root nya subtree, yang terdiri dari beberapa children, dan children nya children. Visiting Sebuah node dikatakan dikunjungi ketika kendali program sampai pada sebuah node, biasanya untuk tujuan menyelesaikan beberapa operasi pada node, seperti mengecek nilai datanya kemudian menampilkannya.
Traversing Traverse maksudnya mengunjungi semua node dalam tree untuk tujuan tertentu, misalnya: untuk mengurutkan datanya. Level Level node adalah banyaknya generasi node yang dihitung mulai dari root. Jika kita mengasumsikan bahwa root adalah level 0, maka children adalah level 1, grandchildren adalah level 2, dan seterusnya. Key Medan data dalam sebuah objek biasanya didesain dengan menggunakan sebuah key. Nilai dari key ini digunakan untuk melakukan pencarian data atau operasi lainnya.
Tree menggunakan Java class Node { int iData; // data yang digunakan sebagai kunci double fData; // data lain node leftChild; // node child kiri node rightChild; // node child kanan public void displayNode() // (bagian dari tubuh method) }
class Tree { private Node root; // satu-satunya medan data dalam tree public void find(int key) } public void insert(int id, double dd) public void delete(int id) // macem-macem methode lain } // akhir dari kelas tree
class TreeApp { public static void main(String[] args) Tree theTree = new Tree; // membuat sebuah tree theTree.insert(50, 1.5); // sisipkan 3 node theTree.insert(25, 1.7); theTree.insert(75, 1.9); node found = theTree.find(25); // cari node dengan key 25 if(found != null) System.out.println(“Found the node with key 25”); else System.out.println(“Could not find node with key 25”); } // akhir main() } // akhir class TreeApp
Pencarian Node 56 < 63 63 27 56 > 27 80 56 > 51 13 51 70 92 26 33 58 56 < 58 82 56 < 57 57 60 Pencarian Node 56
Method Pencarian public Node find(int key) // pencarian node berdasarkan key { // (asumsi tree tidak kosong) Node current = root; // mulai dari root while(current.iData != key) // selama tidak cocok, { if(key < current.iData) // ke kiri? current = current.leftChild; else current = current.rightChild; // atau ke kanan? if(current == null) // jika tidak ada child, return null; // tidak ditemukan } return current; // ditemukan
Penyisipan Node 45 < 60 60 40 45 > 40 45 < 50 30 50 null 45
Method Penyisipan Node public void insert(int id, double dd) { Node newNode = new Node(); // membuat node baru newNode.iData = id; // sisipkan datanya newNode.dData = dd; if(root==null) // di root tidak ada node root = newNode; else // sebagai root Node current = root; // mulai dari root Node parent; while(true) // parent = current; if(id < current.iData) // ke kiri? current = current.leftChild;
if(current == null) // jika sampai pada baris terakhir, { // sisipkan di sebelah kiri parent.leftChild = newNode; return; } } // berhenti jika ke kiri else // atau ke kanan? { current = current.rightChild; if(current == null) // jika sampai pada baris terakhir { // sisipkan di sebelah kanan parent.rightChild = newNode; } // akhir dari else ke kanan } // akhir dari while } // akhir dari else bukan root } // akhir class insert() // -------------------------------------------------------------
Pencarian Nilai Minimum Pencarian Nilai Minimum 63 47 71 22 53 67 minimum 11 33 50 60 17 49 51 Pencarian Nilai Minimum
public Node minimum() // kembalikan node dengan nilai kunci minimum { Node current, last; current = root; // mulai dari root while(current != null) // sampai node paling bawah, last = current; // ingat node-nya current = current.leftChild; // belok ke child kiri } return last;
Method Delete Node yang dihapus adalah leaf (tidak punya child) Node yang dihapus mempunyai satu child Node yang dihapus mempunyai dua child
Penghapusan Node Tanpa Child 10 5 3 7 Penghapusan Node Tanpa Child
public boolean delete(int key) // hapus node { // (asumsi tree tidak kosong) Node current = root; Node parent = root; boolean isLeftChild = true; while(current.iData != key) // mencari node { parent = current; if(key < current.iData) // ke kiri? isLeftChild = true; current = current.leftChild; } else // atau ke kanan? isLeftChild = false; current = current.rightChild; if(current == null) // akhir baris node, return false; // tidak ditemukan } // akhir while //ditemukan node untuk dihapus //selanjutnya...
// kelanjutan delete()… // jika tidak ada chile, langsung hapus if(current.leftChild==null && current.rightChild==null) { if(current == root) // jika root, root = null; // tree kosong else if(isLeftChild) parent.leftChild = null; // putuskan else // dari parent parent.rightChild = null; } // continues...