• Tidak ada hasil yang ditemukan

Delete angka

Dalam dokumen Pemrograman Algoritma Struktur Data pdf (Halaman 151-162)

~ OPERASI INSERT

2. Delete angka

Karena angka 20 ini juga termasuk leaf, maka angka ini juga bisa segera dihapus.

3. Delete angka 12

Karena angka 12 ini mempunyai 2 anak cabang, maka untuk menggantikan angka 12 yang dihapus dapat menggunakan angka yang ada di sebelah kiri subtree bagian kanan yaitu angka 13.

4. Delete angka 9

Karena angka 9 mempunyai 1 cabang di sebelah kiri, maka angka 11 yang merupakan cabang dari 9 dapat menggantikan angka 9 yang dihapus.

5. Delete angka 15

Karena angka 15 merupakan leaf, maka angka ini dapat segera dihapus. 15 13 9 12 11 20 15 13 9 12 11 15 13 9 11 15 13 11

Contoh program : #include <vcl.h> #pragma hdrstop #include <iostream> #include <string> #include <conio.h> using namespace std; class SimpulPohon { public: char data; SimpulPohon* induk; SimpulPohon* kiri; SimpulPohon* kanan; // Konstruktor SimpulPohon(char karakter); }; class PohonBiner { private: SimpulPohon* akar;

bool sisip(SimpulPohon* &ortu, SimpulPohon* ptrBaru); SimpulPohon* cari(SimpulPohon* &akar, char data); string inOrder(SimpulPohon* ptrSimpul);

string preOrder(SimpulPohon* ptrSimpul); string postOrder(SimpulPohon* ptrSimpul);

void hapusSemuaSimpul(SimpulPohon* ptrSimpul); public:

PohonBiner(); ~PohonBiner(); bool sisip(char data); bool cari(char data);

13 9

bool hapus(char data); string inOrder(); string preOrder(); string postOrder(); }; // Konstruktor SimpulPohon SimpulPohon::SimpulPohon(char data) { SimpulPohon::data = data; SimpulPohon::induk = NULL; SimpulPohon::kiri = NULL; SimpulPohon::kanan = NULL; } // Konstruktor PohonBiner PohonBiner::PohonBiner() { PohonBiner::akar = NULL; } // Destruktor PohonBiner PohonBiner::~PohonBiner() { hapusSemuaSimpul(akar); }

// sisip (Bersifat privat)

// Untuk menyisipkan simpul ke pohon // Nilai balik: true = Berhasil disisipkan // false = Gagal karena data kembar

bool PohonBiner::sisip(SimpulPohon* &ortu, SimpulPohon* ptrBaru) {

if (ptrBaru->data == ortu->data) {

delete ptrBaru; // Hapus karena sudah ada return false;

} else

if (ortu->kiri == NULL) { ortu->kiri = ptrBaru; ptrBaru->induk = ortu; return true; } else

return sisip(ortu->kiri, ptrBaru); else // Berarti lebih dari

if (ortu->kanan == NULL) { ortu->kanan = ptrBaru; ptrBaru->induk = ortu; return true; } else

return sisip(ortu->kanan, ptrBaru); }

// sisip (Bersifat publik)

// Untuk menyisipkan data ke pohon // Nilai balik: true = Berhasil disisipkan // false = Gagal karena data kembar bool PohonBiner::sisip(char data) {

SimpulPohon* ptrBaru = new SimpulPohon(data); if (akar == NULL) { akar = ptrBaru; return true; } else

return sisip(akar, ptrBaru); }

// cari (Bersifat privat) // Untuk mencari data data // Nilai balik: true: ketemu

// false: tidak ketemu

// argumen Akar menyatakan akar dari subpohon // untuk pencarian

SimpulPohon* PohonBiner::cari(SimpulPohon* &akar, char data) { if (akar == NULL) return NULL; else if (data == akar->data) return akar; else if (data < akar->data)

return cari(akar->kiri, data); else

return cari(akar->kanan, data); }

// cari (Bersifat publik)

// Menghasilkan : true: kalau data ketemu // false: kalau tidak ketemu

bool PohonBiner::cari(char data) {

if (cari(akar, data) == NULL) return false;

else

return true; }

// hapus (Bersifat publik)

// Nilai balik: false = Data tidak ketemu // true = Data berhasil dihapus bool PohonBiner::hapus(char data) {

SimpulPohon* simpulDihapus = cari(akar, data); if (simpulDihapus == NULL)

{

return true; }

if (simpulDihapus->kanan == NULL) if (simpulDihapus->kiri == NULL) {

// Simpul yang akan dihapus berkedudukan // sebagai daun (tidak punya anak)

if (simpulDihapus == akar) akar = NULL;

else

if (simpulDihapus->induk->kiri == simpulDihapus) // Kalau yang dihapus adalah anak kiri ortunya simpulDihapus->induk->kiri = NULL;

else

// Kalau yang dihapus adalah anak kanan ortunya simpulDihapus->induk->kanan = NULL;

} else {

// Simpul yang akan dihapus memiliki anak di sebelah kiri saja if (simpulDihapus == akar) { akar = simpulDihapus->kiri; akar->induk = NULL; } else {

// Kalau bukan akar

if (simpulDihapus->induk->kiri == simpulDihapus) {

// Merupakan anak kiri dari ortunya

simpulDihapus->induk->kiri = simpulDihapus->kiri; simpulDihapus->kiri->induk = simpulDihapus->induk; }

else {

// Merupakan anak kanan dari ortunya

simpulDihapus->kiri->induk = simpulDihapus->induk; } } } else if (simpulDihapus->kiri == NULL) {

// Simpul yang akan dihapus mempunyai anak di sebelah kanan saja if (simpulDihapus == akar)

{

akar = simpulDihapus->kanan; akar->induk = NULL;

}

else // Kalau bukan akar

if (simpulDihapus->induk->kiri == simpulDihapus) {

// Simpul dihapus adalah anak kiri ortunya

simpulDihapus->induk->kiri = simpulDihapus->kanan; simpulDihapus->kanan->induk = simpulDihapus->induk; }

else {

// Simpul dihapus adalah anak kanan ortunya

simpulDihapus->induk->kanan = simpulDihapus->kanan; simpulDihapus->kanan->induk = simpulDihapus->induk; } } else {

// Simpul yang dihapus memiliki dua buah subpohon // -- Cari pengganti/suksesor simpul yang akan dihapus SimpulPohon* suksesor = simpulDihapus->kanan; while (suksesor->kiri != NULL)

suksesor = suksesor->kiri; // -- Putuskan suksesor dari pohon

{

// Suksesor sebagai anak kiri dari induknya suksesor->induk->kiri = suksesor->kanan; if (suksesor->kanan != NULL) suksesor->kanan->induk = suksesor->induk; } else {

// Suksesor sebagai anak kanan dari induknya suksesor->induk->kanan = suksesor->kanan; if (suksesor->kanan != NULL)

suksesor->kanan->induk = suksesor->induk; }

// Data pada suksesor disalin ke simpul yang akan dihapus simpulDihapus->data = suksesor->data;

// Ubah simpul yang ditunjuk oleh suksesor ke SimpulDihapus simpulDihapus = suksesor;

}

delete simpulDihapus; return true;

}

// InOrder (bersifat privat)

// Menampilkan data secara inorder

string PohonBiner::inOrder(SimpulPohon* ptrSimpul) {

string hasil = ""; if (ptrSimpul != NULL) {

if (ptrSimpul->kiri != NULL)

hasil = hasil + inOrder(ptrSimpul->kiri); hasil = hasil + ptrSimpul->data;

if (ptrSimpul->kanan != NULL)

hasil = hasil + inOrder(ptrSimpul->kanan); }

return hasil; }

// InOrder (bersifat publik)

// Menampilkan data secara inorder string PohonBiner::inOrder()

{

return inOrder(akar); }

// PreOrder (bersifat privat)

// Menampilkan data secara preorder

string PohonBiner::preOrder(SimpulPohon* ptrSimpul) {

string hasil = ""; if (ptrSimpul != NULL) {

hasil = hasil + ptrSimpul->data; if (ptrSimpul->kiri != NULL)

hasil = hasil + preOrder(ptrSimpul->kiri); if (ptrSimpul->kanan != NULL)

hasil = hasil + preOrder(ptrSimpul->kanan); }

return hasil; }

// PreOrder (bersifat publik)

// Menampilkan data secara preorder string PohonBiner::preOrder()

{

return preOrder(akar); }

// PostOrder (bersifat privat)

// Menampilkan data secara postorder

string PohonBiner::postOrder(SimpulPohon* ptrSimpul) {

string hasil = ""; if (ptrSimpul != NULL) {

if (ptrSimpul->kiri != NULL)

if (ptrSimpul->kanan != NULL)

hasil = hasil + postOrder(ptrSimpul->kanan); hasil = hasil + ptrSimpul->data;

}

return hasil; }

// PostOrder (bersifat publik)

// Menampilkan data secara postorder string PohonBiner::postOrder()

{

return postOrder(akar); }

// HapusSemuaSimpul (Bersifat privat) // Untuk menghapus semua simpul

void PohonBiner::hapusSemuaSimpul(SimpulPohon* ptrSimpul) { if (ptrSimpul != NULL) { hapusSemuaSimpul(ptrSimpul->kiri); hapusSemuaSimpul(ptrSimpul->kanan); delete ptrSimpul; } } int main() { PohonBiner pohon;

string dataNama = "KEBUNMAIYA";

// Memasukkan karakter-karakter yang ada di dataNama ke Pohon for (unsigned int i = 0; i < dataNama.length(); i++)

{

if (pohon.sisip(dataNama[i]) == false) cout << "Data " << dataNama[i] << " sudah ada" << endl; else

cout << "Data " << dataNama[i] << " disimpan" << endl;

} cout << "InOrder: " << pohon.inOrder() << endl; cout << "PreOrder: " << pohon.preOrder() << endl; cout << "PostOrder: " << pohon.postOrder() << endl; // Menghapus A, N dan K pohon.hapus('A'); pohon.hapus('N'); pohon.hapus('K');

cout << "Setelah A, N dan K dihapus: " << endl << "PreOrder: "

<< pohon.preOrder() << endl; getch();

}

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2, Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++, Informatika, Bandung, 2010.

Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA, Mitra Wacana Media, Bandung, 2004.

Dalam dokumen Pemrograman Algoritma Struktur Data pdf (Halaman 151-162)

Dokumen terkait