~ 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.