Struktur Data dan Algoritma - Pohon

Pohon mewakili simpul yang dihubungkan oleh tepi. Kami akan membahas pohon biner atau pohon pencarian biner secara khusus.

Binary Tree adalah struktur data khusus yang digunakan untuk tujuan penyimpanan data. Pohon biner memiliki syarat khusus dimana setiap node dapat memiliki maksimal dua anak. Pohon biner memiliki manfaat dari array terurut dan daftar tertaut karena pencarian secepat dalam array yang diurutkan dan operasi penyisipan atau penghapusan secepat dalam daftar tertaut.

Istilah Penting

Berikut adalah istilah-istilah penting yang berkaitan dengan pohon.

  • Path - Path mengacu pada urutan node di sepanjang tepi pohon.

  • Root- Node di puncak pohon disebut root. Hanya ada satu akar per pohon dan satu jalur dari simpul akar ke simpul manapun.

  • Parent - Setiap simpul kecuali simpul akar memiliki satu sisi ke atas ke simpul yang disebut induk.

  • Child - Simpul di bawah simpul tertentu yang dihubungkan dengan ujungnya ke bawah disebut simpul anak.

  • Leaf - Simpul yang tidak memiliki simpul anak disebut simpul daun.

  • Subtree - Subpohon mewakili keturunan dari sebuah node.

  • Visiting - Visiting mengacu pada pengecekan nilai sebuah node saat kontrol berada di node.

  • Traversing - Melintasi berarti melewati node dalam urutan tertentu.

  • Levels- Level dari sebuah node merupakan generasi dari sebuah node. Jika node root berada di level 0, maka node turunan berikutnya ada di level 1, cucunya di level 2, dan seterusnya.

  • keys - Key merepresentasikan nilai dari sebuah node yang menjadi dasar operasi pencarian yang akan dilakukan untuk sebuah node.

Representasi Pohon Pencarian Biner

Pohon Pencarian Biner menunjukkan perilaku khusus. Anak kiri node harus memiliki nilai yang kurang dari nilai induknya dan anak kanan node harus memiliki nilai yang lebih besar dari nilai induknya.

Kami akan mengimplementasikan pohon menggunakan objek node dan menghubungkannya melalui referensi.

Node Pohon

Kode untuk menulis simpul pohon akan serupa dengan yang diberikan di bawah ini. Ini memiliki bagian data dan referensi ke node anak kiri dan kanannya.

struct node {
   int data;   
   struct node *leftChild;
   struct node *rightChild;
};

Di pohon, semua node berbagi konstruksi yang sama.

Operasi Dasar BST

Operasi dasar yang dapat dilakukan pada struktur data pohon pencarian biner, adalah sebagai berikut -

  • Insert - Menyisipkan elemen di pohon / membuat pohon.

  • Search - Mencari elemen di pohon.

  • Preorder Traversal - Melintasi pohon dengan cara pre-order.

  • Inorder Traversal - Melintasi pohon secara berurutan.

  • Postorder Traversal - Melintasi pohon dengan cara pasca-order.

Kita akan belajar membuat (menyisipkan ke) struktur pohon dan mencari item data di pohon dalam bab ini. Kita akan belajar tentang metode melintasi pohon di bab selanjutnya.

Sisipkan Operasi

Penyisipan pertama membuat pohon. Setelah itu, setiap kali elemen akan dimasukkan, pertama-tama cari lokasi yang tepat. Mulailah mencari dari root node, kemudian jika datanya kurang dari nilai kunci, cari lokasi kosong di subtree kiri dan masukkan datanya. Jika tidak, cari lokasi kosong di subtree kanan dan masukkan datanya.

Algoritma

If root is NULL 
   then create root node
return

If root exists then
   compare the data with node.data
   
   while until insertion position is located

      If data is greater than node.data
         goto right subtree
      else
         goto left subtree

   endwhile 
   
   insert data
	
end If

Penerapan

Implementasi fungsi insert akan terlihat seperti ini -

void insert(int data) {
   struct node *tempNode = (struct node*) malloc(sizeof(struct node));
   struct node *current;
   struct node *parent;

   tempNode->data = data;
   tempNode->leftChild = NULL;
   tempNode->rightChild = NULL;

   //if tree is empty, create root node
   if(root == NULL) {
      root = tempNode;
   } else {
      current = root;
      parent  = NULL;

      while(1) {                
         parent = current;

         //go to left of the tree
         if(data < parent->data) {
            current = current->leftChild;                
            
            //insert to the left
            if(current == NULL) {
               parent->leftChild = tempNode;
               return;
            }
         }
			
         //go to right of the tree
         else {
            current = current->rightChild;
            
            //insert to the right
            if(current == NULL) {
               parent->rightChild = tempNode;
               return;
            }
         }
      }            
   }
}

Operasi Pencarian

Kapanpun sebuah elemen akan dicari, mulailah mencari dari root node, kemudian jika datanya kurang dari nilai kunci, cari elemen tersebut di subtree kiri. Jika tidak, cari elemen di subtree kanan. Ikuti algoritma yang sama untuk setiap node.

Algoritma

If root.data is equal to search.data
   return root
else
   while data not found

      If data is greater than node.data
         goto right subtree
      else
         goto left subtree
         
      If data found
         return node
   endwhile 
   
   return data not found
   
end if

Penerapan algoritma ini akan terlihat seperti ini.

struct node* search(int data) {
   struct node *current = root;
   printf("Visiting elements: ");

   while(current->data != data) {
      if(current != NULL)
      printf("%d ",current->data); 
      
      //go to left tree

      if(current->data > data) {
         current = current->leftChild;
      }
      //else go to right tree
      else {                
         current = current->rightChild;
      }

      //not found
      if(current == NULL) {
         return NULL;
      }

      return current;
   }  
}

Untuk mengetahui tentang implementasi struktur data pohon pencarian biner, silakan klik di sini .