Tampilkan postingan dengan label Struktur Data dan Algoritma. Tampilkan semua postingan
Tampilkan postingan dengan label Struktur Data dan Algoritma. Tampilkan semua postingan

Kamis, 18 Oktober 2012

Binary Tree : Mencari kedalaman suatu binary tree


Pengertian kedalaman (depth) atau ketinggian (height) pada tree.
Tree bisa didefinisikan sebagai suatu kumpulan elemen yang salah satu elemennya disebut dengan akar (root), dan sisa elemen lainnya (yang disebut simpul) terpecah menjadi sejumlah himpunan yang paling tidak berhubungan satu sama lain, yang disebut dengan subpohon (subtree), atau disebut juga cabang. Jika kita melihat pada subpohon, maka subpohon inipun juga mempunyai akar dan sub-subpohonnya masing-masing.
Dalam kehidupan sehari-hari, tree dapat dilihat dari pohon silsilah keluarga. Tingkat yang tertinggi disebut juga sebagai root. Untuk lebih jelasnya lihat gambar di bawah ini  merupakan contoh dari sebuah tree.

Di dalam sebuah tree dikenal istilah Tingkat atau level. Tingkat (level) suatu simpul ditentukan dengan pertama kali menentukan akar sebagai bertingkat 0. jika suatu simpul dinyatakan sebagai tingkat N, maka simpul-simpul yang merupakan anaknya dikatakan berada dalam tingkat N+1. pada pohon dibawah merupakan tree dengan 4 level.
Tinggi (Height) atau Kedalaman (Depth) dari suatu pohon adalah tingkat(level) maksimum dari suatu pohon dikurangi dengan satu. Dengan demikian pohon diatas mempunyai tinggi atau kedalaman sama dengan 4.






Pohon Biner (Binary Tree)
Pohon biner bisa didefinisikan sebagai suatu kumpulan simpul yang mungkin kosong atau mempunyai akar dan dua subpohon yang saling terpisah yang disebut dengan subpohon kiri dan sub pohon kanan. Subpohon disebut juga sebagai cabang. Karakteristik dari pohon biner ialah bahwa setiap simpul paling banyak hanya mempunyai dua buah anak. Dengan kata lain derajat tertinggi dari sebuah pohon biner adalah dua.
Pengertian daun, root, level, tinggi dan derajad yang berlaku pada pohon juga berlaku pada binary tree. Penyajian binary tree pada komputer di gunakan double link list.
Deklarasi mencari kedalaman atau ketinggian dari suatu tree
int height(Tree *root)
{
 if (root == NULL) return -1;
 int u = height(root->left), v = height(root->right);
 if (u > v)
return u+1;
 else
return v+1;
}
Algoritma pada penghitungan kedalaman dimulai dari menghitung 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.

contoh codingnya :





 

#include <iostream.h>
#include <conio.h>
#include <stdio.h>



struct tree_node     //deklarasi variabel
{                    //menggunakan double linked list
    int data;
    tree_node* left;
    tree_node* right;
};


tree_node* root;


bool isEmpty()
{return root==NULL;}


void insert(int d) //untuk memasukkan data
{
    tree_node* t = new tree_node;
    tree_node* parent;

    t->data = d; //data masukan
    t->left = NULL;//cabang kiri
    t->right = NULL;//cabang kanan

    parent = NULL;

    if(isEmpty())root = t; //jika belum ada data yg dimasukkan

   else  //jika sudah ada data yang masuk
        {
            tree_node* curr;
            curr = root;

            while(curr!=NULL)
                {
                    parent = curr;
               if(t->data == curr->data) { printf("DATA ALREADY EXIST !"); break;  }
                    else if(t->data > curr->data) {curr = curr->right;}
                    else if(t->data < curr->data) {curr = curr->left;}


            }
         //meletakkan posisi anak
            if(t->data < parent->data) parent->left = t;
         else if(t->data > parent->data) parent->right = t;
         else if(t->data == parent->data) parent->left = parent->right = NULL;
        }
}




void inorder(tree_node* p) //menampilkan data dengan kunjungan secara inorder
{
    if(p!=NULL)
        {
            if(p->left) inorder(p->left);

            cout<<" "<<p->data<<" ";

            if(p->right)inorder(p->right);
        }
    else return;
}





void print_inorder() //menampilkan inorder
{
    inorder(root);
}


void print(struct tree_node* p, int x, int y, int j)
{
if(p == NULL) return;
gotoxy(x,y);
printf("%d", p->data);
print(p -> left, x-j, y+2, j/2);
print(p -> right, x+j, y+2, j/2);
getch();
}


int height(tree_node* p) //fungsi height untuk menghitung kedalaman tree
{
    if(p==NULL)return -1;
    else {
               int l = height(p->left) ;
                int r = height(p->right);
                if (l > r) {return l+1;}
                else {return r+1;}
        }
getch();
}


void print_height() //menampilkan kedalaman dari tree
{
    height(root);
}





int main()
{
    root=NULL;
    int a,data;


    while(1)
        {
         clrscr();
            cout<<endl;

         cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
         cout<<"===============================================================================\n";
         cout<<"\t\t\t\tPROGRAMMER BY :\n";
         printf("\t\t"); textcolor(17); cprintf("1. Ulva S. Nurmayani"); textcolor(7);
         printf("\t\t"); textcolor(26); cprintf("081012015"); textcolor(7);                                                                      
         printf("\n\t\t"); textcolor(37); cprintf("2. Etik Ulfianita");  textcolor(7);
         printf("\t\t"); textcolor(27);   cprintf("081012016"); textcolor(7);
            printf("\n\t\t"); textcolor(13); cprintf("3. Madya Vica A.");  textcolor(7);
         printf("\t\t"); textcolor(14);   cprintf("081012025"); textcolor(7);
            printf("\n\t\t"); textcolor(495); cprintf("4. Candra Arga M.");  textcolor(7);
         printf("\t\t"); textcolor(396);   cprintf("081012063"); textcolor(7);
         printf("\n\t\t"); textcolor(395); cprintf("5. Nuri Fashichah");  textcolor(7);
         printf("\t\t"); textcolor(300);   cprintf("081012066"); textcolor(7);

            cout<<"\n===============================================================================\n\n\n";
         cout<<"\n\t\t\a1----INSERT A NODE IN A BINARY TREE.";
            cout<<"\n\t\t\a2----IN-ORDER TRAVERSAL.";
            cout<<"\n\t\t\a3----HEIGHT OF TREE.";
            cout<<"\n\t\t\a4----EXIT.";
            cout<<"\n\n\t\t\aENTER CHOICE::";
            cin>>a;
         print(root, 40, 2, 20);
         cout<<endl;

         switch(a)
                {

                    case 1 : gotoxy(37,39);
               printf("\n\tENTER THE ELEMENT : ");
                    scanf("%d",&data);
                    insert(data);
               print(root, 40, 2, 20);
                    break;

               case 2 : gotoxy(37,39);
               cout<<endl;
               cout<<"\n\t****IN-ORDER TRAVERSAL OF A TREE****"<<endl;
                    cout<<"\t------------------------------------"<<endl;
                    print_inorder();
               getch();
                    break;

               case 3 : gotoxy(37,39);
               cout<<"\n\tHEIGHT OF A TREE"<<endl;
                    cout<<"\t-----------------"<<endl;
                    cout<<height(root);
               getch();
                    break;

                    case 4 : cout<<"\n\n\n\t\t\tTHANKS";
               return 0;
                    break;

               default: gotoxy(37,39);
               cout<<"INVALID INPUT"<<endl;
                    getch();
                    break;
                }
        }
}