TREE Definisi Merupakan salah satu bentuk struktur data non-linear yang menggambarkan hubungan yang bersifat hirarkis antara elemen-elemen. Tree dapat juga didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus yang disebut root dan node lainnya yang terbagi lagi menjadi himpunan-himpunan yang disebut subtree. Istilah-istilah Umum dalam Tree a. Predecessor : node yang berada di atas node tertentu b. Successor : node yang berada di bawah node tertentu. c. ncestor : seluruh node yang terletak sebelum node tertentu dan terletak pada jalur yang sama. d. Descant : seluruh node yang terletak sesudah node tertentu dan terletak pada jalur yang sama. e. Father : predecessor satu level di atas suatu node. f. Son : successor satu level di bawah suatu node. g. Sibling : node-node yang memiliki father yang sama dengan suatu node. h. Subtree : bagian dari tree yang berupa suatu node beserta descantnya dan memiliki semua karakteristik dari tree tersebut. i. Size : anyaknya node dalam suatu tree. j. Height : anyaknya tingkatan/level dalam suatu tree. k. Root : Satu-satunya node khusus dalam tree yang tak punya predecessor. l. Leaf : Node-node dalam tree yang tak memiliki successor. m. Degree : anyaknya son yang dimiliki suatu node. Pusat Pengembangan Pidikan Universitas Gadjah Mada 1
Contoh : Subtree Root Keterangan : ncestor (H) = F,C, Descant (F) = H,I C Father (D) = Son () =,C Sibling (D) = E D E F Size = 9 Height = 4 G H Root = I Leaf = D,G,H,I Degree (E) = 1 Gambar 1, inary Tree eberapa Jenis Tree 1. inary Tree inary Tree adalah tree dengan syarat bahwa setiap node hanya boleh memiliki maksimal dua subtree dan kedua subtree tersebut harus terpisah. Dengan demikian, maka setiap node dalam binary tree hanya boleh memiliki paling banyak dua son (perhatikan gambar 1). Jika adalah root dari suatu binary tree, maka dikatakan left son dari dan C dikatakan right son dari. Kemudian dikatakan father dari dan C. Sebuah node yang tidak memiliki son (seperti D, G, H, atau I pada gambar 1) dinamakan leaf. Node n1 adalah ancestor dari node n2 (dan n2 adalah descant dari n1) jika n1 adalah father dari n2 atau father dari beberapa ancestor n2. Seperti contoh pada gambar 1, adalah ancestor dari G, dan H adalah descant dari C, tapi E bukan ancestor maupun descant dari C. Node n2 adalah left descant dari node n1 jika n2 juga left son dari n1 atau descant dari left son n1, begitu sebaliknya untuk right descant. Dua node dikatakan brothers jika masing-masing node adalah left dan right son dari father yang sama. Meskipun sebuah tree (pohon) yang sesungguhnya tumbuh dengan root (akar) di dalam tanah dan dengan leaf (daun) di udara, namun dalam ilmu komputer secara umum melukiskan struktur data tree dengan root di atas dan leaf Pusat Pengembangan Pidikan Universitas Gadjah Mada 2
di bagian bawah. rah dari root menuju leaf disebut down dan sebaliknya disebut up. Perpindahan dari leaf menuju root dinamakan climbing, sedangkan perpindahan dari root menuju leaf dinamakan descing. Jika setiap node dalam binary tree selalu terdapat left dan right subtree, maka tree yang demikian dikatakan sebagai strictly binary tree seperti contoh pada gambar 2, sementara gambar 1 tidak dapat dikatakan sebagai strictly binary tree karena node C dan E masing-masing hanya memiliki satu son. C D E F G Gambar 2, Strictly inary Tree. Sebuah strictly binary tree dengan n leaf selalu terdapat 2n 1 node. Perhatikan gambar 2, terdapat n = 4 leaf. Sehingga terdapat sebanyak (2 * 4) - 1 = 7 node. Level dari suatu node dalam binary tree didefinisikan dengan mengikuti suatu aturan bahwa : root dari sebuah tree berada pada level 0, kemudian level dibawahnya adalah level 1, dan seterusnya. Sebagai contoh, pada binary tree yang terdapat dalam gambar 2, adalah root dan berada pada level 0, dan C berada pada level 1, D dan E berada pada level 2, F dan G berada pada level 2. Depth (kedalaman) dari binary tree adalah level maksimum dari beberapa leaf di dalam tree. Jika suatu binary tree pada setiap nodenya (kecuali leaf) memiliki dua son, dan setiap subtree memiliki panjang path yang sama, maka yang demikian dikatakan sebagai complete binary tree (perhatikan gambar 3). Jika pada complete binary tree terdapat n node pada level l, kemudian depth binary tree adalah d, secara matematis dapat dirumuskan sebagai berikut : Pusat Pengembangan Pidikan Universitas Gadjah Mada 3
tn 2 0 2 1 2 2... 2 d d j 0 2 j dimana, tn mewakili total jumlah node, d mewakili depth suatu binary tree. C D E F G H I J K L M N O Gambar 3, Complete inary Tree. 2. inary Search Tree inary Search Tree adalah binary tree dengan sifat bahwa semua left son harus lebih kecil daripada right son dan fathernya. inary search tree dibuat untuk mengatasi kelemahan pada binary tree biasa, yaitu kesulitan dalam searching/pencarian node tertentu dalam binary tree. 2.1. Operasi-operasi pada inary Search Tree a. Melakukan setup sebuah tree yang kosong. b. Melakukan pengujian apakah sebuah tree kosong. c. Menambahkan node baru. d. Traverse, yaitu mengunjungi seluruh node pada tree, masing-masing sekali. da tiga cara traverse, yaitu : PreOrder, InOrder dan PostOrder e. Melakukan pencarian node dengan kunci pencarian node yang spesifik. f. Menghapus node yang telah dibuat. g. Melakukan akses pada node yang ditunjuk secara spesifik. Pusat Pengembangan Pidikan Universitas Gadjah Mada 4
Melakukan setup sebuah tree yang kosong, melakukan pengujian apakah sebuah tree kosong, dan menambahkan/menyisipkan node baru. { Deklarasi inary Tree } type NodePtr = ^NodeRec; NodeRec = record value : integer; left, right : NodePtr; var root : NodePtr; value left right Program 1, Deklarasi inary Tree { Insert Tree } procedure InsertTree(X:integer; Var StartNode : NodePtr); var NewEntry : NodePtr; if (StartNode=nil) then new(newentry); NewEntry^.value := X; NewEntry^.left := nil; NewEntry^.right := nil; StartNode := NewEntry; if (X < StartNode^.value) then InsertTree(X, StartNode^.left) InsertTree(X, StartNode^.right); Program 2, Procedure untuk menambah item/node kedalam binary tree. { Print Tree } procedure PrintTree(StartNode : NodePtr); if (StartNode<>nil) then PrintTree(StartNode^.left); writeln(startnode^.value); PrintTree(StartNode^.right); Program 3, Procedure untuk mencetak binary tree Pusat Pengembangan Pidikan Universitas Gadjah Mada 5
Traverse, yaitu mengunjungi seluruh node pada tree, secara PreOrder, InOrder dan PostOrder. PreOrder : cetak isi node yang dikunjungi, kunjungi left son, kunjungi right son. InOrder : kunjungi left son, cetak isi node yang dikunjungi, kunjungi right son. PostOrder : kunjungi left son, kunjungi right son, cetak isi node yang dikunjungi. { PreOrder } procedure PreOrder(Tree : NodePtr); if Tree<>nil then write(tree^.value); PreOrder(Tree^.left); PreOrder(Tree^.right); Program 4, Procedure untuk melakukan kunjungan secara PreOrder. { InOrder } procedure InOrder(Tree : NodePtr); if Tree<>nil then InOrder(Tree^.left); write(tree^.value); InOrder(Tree^.right); Program 5, Procedure untuk melakukan kunjungan secara InOrder. { PostOrder } procedure PostOrder(Tree : NodePtr; if Tree<>nil then PostOrder(Tree^.left); PostOrder(Tree^.right); write(tree^.value); Program 6, Procedure untuk melakukan kunjungan secara PostOrder. Pusat Pengembangan Pidikan Universitas Gadjah Mada 6
Jika pelaksanaan InOrder dan PreOrder diketahui, maka binary tree bisa ditentukan, sehingga kunjungan secara PostOrder juga bisa ditentukan. Contoh 1 : jika diketahui PreOrder dan InOrder PreOrder D G C E H I F InOrder D G H E I C F C D E F G H I Gambar 4, inary tree dan cara melakukan kunjungan PostOrder G D H I E F C Contoh 2 : jika diketahui InOrder dan PreOrder InOrder 10 20 30 40 50 60 70 80 90 PreOrder 50 20 10 40 30 60 80 70 90 50 20 60 10 40 80 30 70 90 Gambar 5, inary tree dan cara melakukan kunjungan PostOrder 10 30 40 20 70 90 80 60 50 Pusat Pengembangan Pidikan Universitas Gadjah Mada 7
Contoh 3 : jika diketahui InOrder dan PostOrder InOrder R T U S P PostOrder R T U S P T P R S U Gambar 6, inary tree dan cara melakukan kunjungan PreOrder T R P S U Contoh 4 : jika diketahui InOrder dan PostOrder InOrder F H D E I G C PostOrder H F D I G E C C D E F G H I Gambar 7, inary tree dan cara melakukan kunjungan PreOrder D F H C E G I Jika diketahui secara PreOrder dan PostOrder ternyata binary tree tidak tunggal, sehingga sulit ditentukan. Pusat Pengembangan Pidikan Universitas Gadjah Mada 8
Melakukan pencarian node dengan kunci pencarian node yang spesifik. { Search Tree } procedure SearchTree(x : integer; var Entry : NodePtr; var Found : boolean); Found := false; Entry := Root; while (not Found) and (Entry<>nil) do if (Entry^.value=x) then Found := true if (x<entry^.value) then Entry := Entry^.left Entry := Entry^.right Program 7, Searching pada inary Tree { Find Position } procedure FindPosition(x: integer; var Entry : NodePtr; var Father : NodePtr; var Found : boolean); Found := false; Entry := Root; Father := nil; while (not Found) and (Entry <> nil) do if (Entry^.value=x) then Found := true Father := Entry; If (x<entry^.value) then Entry := Entry^.left Entry := Entry^.right Program 8, Searching pada inary Tree untuk menentukan posisi father. Pusat Pengembangan Pidikan Universitas Gadjah Mada 9
Menghapus node yang telah dibuat. Menghapus node merupakan operasi yang sangat kompleks, karena ketika node dihapus dari sebuah tree, descant harus melakukan link kembali pada tree dengan posisi yang tepat. Untuk menghapus node, terlebih dahulu harus mengetahui father dari node. { Delete Tree } procedure DeleteEntry(var Entry, Father : NodePtr); var NewChild : NodePtr; if (Entry^.left=nil) then NewChild := Entry^.right; lterparent(father, Entry, NewChild) NewChild := Entry^.left; lterparent(father, Entry, NewChild) PromoteSuccessor(Entry) (a) procedure lterparent(var Father : NodePtr; Entry, NewChild : NodePtr); if (Father=nil) then Root := NewChild if (Father^.left=Entry) then Father^.left := NewChild Father^.right := NewChild (b) Pusat Pengembangan Pidikan Universitas Gadjah Mada 10
procedure PromoteSuccessor (var Entry : NodePtr); var Successor, SuccParent : NodePtr; Successor := Entry^.right; SuccParent := Entry; while (Successor^.left <> nil) do SuccParent := Successor; Successor := Successor^.left; if (SuccParent=Entry) then Entry^.right := Successor^.right Successor^.left := Successor^.right; Entry^.value := Successor^.value; (c) Program 9, (a) menghapus node pada binary tree, (b) memindahkan kedudukan father/parent (c) procedure untuk mapatkan successor pengganti. Pusat Pengembangan Pidikan Universitas Gadjah Mada 11