Langsung ke konten utama

PERTEMUAN 15 STRUKTUR DATA

 PERTEMUAN 15

Penjelasan Materi

    Pohon (Tree) adalah graf terhubung yang tidak mengandung sirkuit. Karena merupakan graf terhubung maka pada pohon selalu terdapat path atau jalur yang menghubungkan kedua simpul di dalam pohon. Pohon dilengkapi dengan Root (akar). 

        Proses 

            a. Inisialisasi 

            b. Pembuatan sebuah simpul 

            c. Pembuatan simpul akar 

            d. Penambahan (insert) simpul kedalam sebuah pohon 

            e. Penghapusan (delete) simpul dari sebuah pohon 

            f. Pembacaan/penelusuran pohon biner

Soal :

        1. Buatlah fungsi untuk menghapus suatu node pada Tree!

        2. Buatlah program lengkap untuk memanipulasi dan mensimulasikan tree


PROGAM SOAL 1 :



PROGRAM SOAL 2 :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct Node
//punya-ricky-ahmad
//191011401516
{
    int data;
    Node *kiri;
    Node *kanan;
};
Node *pohon = NULL;
void tambah (Node **root, int databaru)
{
    if ((*root)==NULL)
       {
        Node *baru;
        baru = new Node;
        baru->data=databaru;
        baru->kiri=NULL;
        baru->kanan=NULL;
        (*root) = baru;
        (*root) -> kiri = NULL;
        (*root) -> kanan = NULL;
        printf("Data Bertambah!");
       }
    else if (databaru<(*root)->data)
              tambah(&(*root)->kiri,databaru);
    else if (databaru>(*root)->data)
        tambah(&(*root)->kanan,databaru);
    else if (databaru==(*root)->data)
        printf("Data Sudah ada!");
}
void preOrder(Node *root)
{
    if(root!=NULL)
    {
        if(root->data!=NULL)
        {
            printf("%d ",root->data);
        }
        preOrder(root->kiri);
        preOrder(root->kanan);
    }
}
void inOrder(Node *root)
{
       if(root!=NULL)
       {
           inOrder(root->kiri);
           if(root->data!=NULL)
           {
               printf("%d ",root->data);
           }
           inOrder(root->kanan);
        }
}
void postOrder(Node *root)
{
       if(root!=NULL)
       {
         postOrder(root->kiri);
         postOrder(root->kanan);
         if(root->data!=NULL)
         {
            printf("%d ",root->data);
         }
       }
}
void search(Node **root, int cari)
{
    if((*root) == NULL)
    {
        printf("Data tidak ditemukan!");
    }
    else if(cari < (*root)->data)
        search(&(*root)->kiri,cari);
    else if(cari > (*root)->data)
        search(&(*root)->kanan,cari);
    else if(cari == (*root)->data)
        printf("Data ditemukan!");
}
int count(Node *root)
{
       if(root==NULL)
              return 0;
       else
              return count(root->kiri)+ count(root->kanan)+1;
}
int height(Node *root)
{
       if(root == NULL)
              return -1;
       else{
              int u = height(root->kiri);
        int v = height(root->kanan);
        if(u > v)
          return u + 1;
        else
          return v + 1;
       }
}
void hapus(Node **root, int del)
{
       Node *curr;
       Node *parent;
       curr = (*root);
       bool flag = false;
       while(curr != NULL)
       {
              if(curr->data == del)
              {
                     flag = true;
                      break;
              }
              else
              {
                  parent = curr;
                  if(del>curr->data)
                     curr = curr->kanan;
                  else
                     curr = curr->kiri;
              }
       }
    if(!flag)
    {
        cout<<"Data tidak ditemukan. Penghapusan tidak dilakukan."<<endl;
        return;
    }
       if(height(pohon) == 0)
       {
              if( curr->kiri== NULL && curr->kanan == NULL)
              {
                     (*root) = NULL;
                    
                     return;
              }
       }
       else if(height(pohon) > 0)
       {
              if( curr->kiri== NULL && curr->kanan == NULL)
              {
                     if(parent->kiri == curr)
                     {
                           parent->kiri = NULL;
                           delete curr;
                     }
                     else
                     {
                           parent->kanan = NULL;
                           delete curr;
                     }
                     return;
              }
if((curr->kiri == NULL && curr->kanan != NULL)|| (curr->kiri != NULL && curr->kanan == NULL))
              {
                     if(curr->kiri == NULL && curr->kanan != NULL)
                     {
                           if(parent->kiri == curr)
                           {
                              parent->kiri = curr->kanan;
                              delete curr;
                         }
                         else
                         {
                              parent->kanan = curr->kanan; 
                              delete curr;
                         }
                     }
                  else
                  {
                           if(parent->kiri == curr)
                           {
                                  parent->kiri = curr->kiri;
                                  delete curr;
                           }
                           else
                           {
                               parent->kanan = curr->kiri;
                               delete curr;
                            }
                   }
                   return;
              }
              if (curr->kiri != NULL && curr->kanan != NULL)
              {
                     Node* bantu;
                     bantu = curr->kanan;
                     if((bantu->kiri == NULL) && (bantu->kanan == NULL))
                     {
                           curr = bantu;
                           delete bantu;
                           curr->kanan = NULL;
                     }
                     else
                     {
                           if((curr->kanan)->kiri != NULL)
                           {
                                  Node* bantu2;
                                  Node* bantu3; 
                                  bantu3 = curr->kanan;
                                  bantu2 = (curr->kanan)->kiri;
                                  while(bantu2->kiri != NULL)
                                  {
                                         bantu3 = bantu2;
                                         bantu2 = bantu2->kiri;
                                  }
                                  curr->data = bantu2->data;
                                  delete bantu2;
                                  bantu3->kiri = NULL;
                        }
                        else
                        {
                              Node* tmp;
                              tmp = curr->kanan;
                              curr->data = tmp->data;
                              curr->kanan = tmp->kanan;
                              delete tmp;
                        }
                     }
                     return;
              }
       }
}
int main()
{
    char pil;
    int del,cari;
    while (true)
    {
        system("cls");
        char data;
    printf(" ======================================\n");
  printf(" =     RICKY AHMAD | 191011401516     =\n");
  printf(" =          Program Tree C++          =\n");
  printf(" ======================================\n");
        printf("\n MENU");
        printf("\n ----\n");
        printf(" [1] Tambah Data\n");
        printf(" [2] Lihat Pre-Order\n");
        printf(" [3] Lihat In-Order\n");
        printf(" [4] Lihat Post-Order\n");
        printf(" [5] Delete\n");
        printf(" [6] Kosongkan Data\n");
        printf(" [7] Search\n");
        printf(" [8] Hitung Node pada Tree\n");
        printf(" [9] Kedalaman Tree\n");
        printf(" [X] Keluar\n");
        printf(" Pilihan Anda : ");
        scanf("%c",&pil);
        fflush(stdin);
        switch(pil)
        {
            case '1':
                     printf("\n INPUT : ");
                     printf("\n-------");
                     printf("\n Masukkan data: ");
                     scanf("%d", &data);
                     tambah(&pohon,data);
                     _getch();
                      break;
              case '2':
                     printf("\n OUTPUT PRE ORDER : ");
                     printf("\n------------------\n");
                     if(pohon!=NULL)
                           preOrder(pohon);
                     else
                           printf(" Masih Kosong!!!");
                    
                     _getch();
                     break;
              case '3':
                     printf("\n OUTPUT IN ORDER : ");
                     printf("\n------------------\n");
                     if(pohon!=NULL)
                           inOrder(pohon);
                     else
                           printf(" Masih Kosong!!!");
                    
                     _getch();
                     break;
              case '4':
                     printf("\n OUTPUT POST ORDER : ");
                     printf("\n------------------\n");
                     if(pohon!=NULL)
                           postOrder(pohon);
                     else
                           printf(" Masih Kosong!!!");
                     _getch();
                     break;
              case '5':
                     if(pohon!=NULL)
                     {
                           printf("\n SEBELUM NODE DIHAPUS : ");
                           printf("\n---------------------- ");
                           printf("\n PRE ORDER  : ");
                           preOrder(pohon);
                           printf("\n IN ORDER   : ");
                           inOrder(pohon);
                           printf("\n POST ORDER : ");
                           postOrder(pohon);
                           printf("\n\n PENGHAPUSAN DATA : ");
                           printf("\n------------------\n");
                           printf(" Masukkan data yang ingin dihapus: ");
                           scanf("%d", &del);
                           hapus(&pohon, del);
                           printf("\n\n SETELAH NODE DIHAPUS : ");
                           printf("\n---------------------- ");
                           printf("\n PRE ORDER  : ");
                           preOrder(pohon);
                           printf("\n IN ORDER   : ");
                           inOrder(pohon);
                           printf("\n POST ORDER : ");
                           postOrder(pohon);
                     }
                     else
                           printf("\n Masih kosong!");
                     _getch();
                     break;
              case '6':
                     pohon=NULL;
                     printf("\n PENGOSONGAN ELEMEN ");
                     printf("\n------------------");
                     printf("\n Tree sudah dikosongkan!!");
                     _getch();
                     break;
              case '7':
                     printf("\n OUTPUT -> Hanya untuk mengecek apakah data dimaksud terdapat dalam tree");
                     printf("\n------");
                     if(pohon!=NULL)
                     {
                           printf("\n PRE ORDER  : ");
                           preOrder(pohon);
                           printf("\n IN ORDER   : ");
                           inOrder(pohon);
                           printf("\n POST ORDER : ");
                           postOrder(pohon);
                           printf("\n\n PENCARIAN DATA");
                           printf("\n--------------");
                           printf("\n Masukkan data yang ingin dicari : ");
                           scanf("%d", &cari);
                           search(&pohon, cari);
                     }
                     else
                           printf("\n Masih kosong!");
                     _getch();
                     break;
              case '8':
                     printf("\n JUMLAH NODE DI DALAM TREE");
                     printf("\n-------------------------");
                     printf("\n Jumlah Node :  %d", count(pohon));
                    
                     _getch();
                     break;
              case '9' :
                     printf("\n KEDALAMAN TREE(LEVEL-> DIMULAI DARI 0)");
                     printf("\n----------------------------------------");
                     printf("\n Kedalaman tree : %d\n", height(pohon));
                                   
                     _getch();
                     break;
              case 'X'|'x':
                     exit(0);
                     break;
              }
       }
}


HASIL :



Untuk Pdf Bisa Download Di :


Komentar

Postingan populer dari blog ini

PERTEMUAN 14 STRUKTUR DATA

  PERTEMUAN 14 Soal : 1.       Pohon dengan jumlah simpul=273 merupakan Full atau atau Complete tree 2.   Berapa kedalamannya? 3.   Nomor berapa simpul terkiri dari level tersebut? 4.   Berapa jumlah maksimum simpul pada level 7 5.   Nomor berapa anak kanan dari simpul ke 180? Ada dilevel berapa anak tersebut 6.   Nomor berapa orang tua dari simpul ke 83? Ada di level berapa orang tua tertsebut?   Jawab : 1.     Itu adalah Full Binary Tree, Karena Full Binary Tree adalah sebuah pohon di mana setiap simpul mempunyai nol atau dua anak. 2.       Kedalamannya adalah (k) 3.       Nomornya adalah 2 (k) 4.       Jumlah Maksimum Pada Level 7 Adalah 64 Sampai 127 5.       Nomor anak kanan dari simpul ke 180 adalah 361 6.       Nomor Orang tua dari simpul 83 adalah 4...

PERTEMUAN 12 STRUKTUR DATA

  PERTEMUAN 12 1.       Sudah ada linked list sbb : a.        Sebutkan nama-nama pointer sesuai dengan nomornya b.       Sebutkan pointer yang nilainya sama Jawab : a.        First (1), Head (2), Null (3), Next Link (4), Prev Link (5), Tail (6), Null (7) b.       Info   2.     Akan dibuat Linked List untuk mengelola data mahasiswa dengan struktur NIM, NAMA,NILAI. Data tersusun naik berdasarkan NILAI Program : Hasil : Untuk Pdf Bisa Download Di : PDF