Pohon Biner dalam Struktur Data (CONTOH)

Apa itu Pohon Biner?

Kata biner berarti dua. Dalam struktur data pohon “Pohon Biner” berarti pohon yang setiap nodenya dapat memiliki maksimal dua node anak (node ​​kiri dan kanan). Ini adalah pohon biner sederhana.

Namun, ada pohon biner lain yang paling sering digunakan dan memiliki beberapa kasus penggunaan. Pohon ini disebut Pohon Pencarian Biner (BST). Pohon ini dapat membuat algoritma pencarian jauh lebih cepat, tepatnya kompleksitas waktu log(n). Dalam struktur data, n berarti jumlah simpul dalam pohon biner.

Apa Perbedaan Antara Pohon Biner dan Pohon Pencarian Biner?

Perbedaan BST dengan Binary Tree biasa adalah pada BST node kiri mempunyai nilai lebih kecil dibandingkan node root, dan node kanan mempunyai nilai lebih besar dibandingkan node root. Jadi, subpohon kiri akan selalu berisi nilai yang lebih kecil dari akarnya, dan subpohon kanan akan selalu berisi nilai lebih besar dari akarnya.

Perbedaan Antara Pohon Biner dan Pohon Pencarian Biner

Contoh Pohon Pencarian Biner

Mari kita ambil contoh berikut untuk menunjukkan konsep Pohon Pencarian Biner.

Contoh Pohon Pencarian Biner

Di sini Anda dapat semua node mengikuti disiplin yang diberikan. Ada rumus untuk jumlah maksimum node di Pohon Pencarian Biner. Jika kita mengamati pohon di atas, kita dapat melihat setiap node memiliki dua anak kecuali semua node daun. Dan tinggi(h) Pohon Biner yang diberikan adalah 4. Rumusnya adalah 2h - 1. Jadi, hasilnya adalah 15.

Contoh Pohon Pencarian Biner

Contoh Pohon Pencarian Biner

Gambar di atas bukanlah Pohon Biner Lengkap atau Pohon Biner Seimbang, melainkan disebut Pohon Biner Lengkap atau Pohon Biner Seimbang. Ada Struktur Data lain yang disebut AVL (jenis lain dari Pohon Biner) yang mengoptimalkan ketinggian Pohon Biner dan melakukan pencarian BST lebih cepat seperti pada Gambar 3.

Cobalah untuk menghitung traversal berurutan dari Pohon Biner yang diberikan di atas. Anda akan menemukan bahwa ini akan memberikan array yang diurutkan tidak menurun, dan algoritma Traversal akan sama dengan Pohon Biner.

Jenis Pohon Biner

Berikut adalah beberapa jenis Pohon Biner yang penting:

  • Pohon Biner Penuh: Setiap node dapat memiliki 0 atau 2 node anak di pohon biner ini. Hanya satu simpul anak yang tidak diperbolehkan dalam jenis pohon biner ini. Jadi, kecuali node daun, semua node akan memiliki 2 anak.

Jenis Pohon Biner

  • Pohon Biner Penuh: Setiap node dapat memiliki 0 atau 2 node. Kelihatannya seperti Pohon Biner Penuh, namun semua elemen daunnya condong ke subpohon kiri, sedangkan pada pohon biner penuh simpulnya bisa berada di subpohon kanan atau kiri.

Jenis Pohon Biner

  • Pohon Biner Sempurna: Semua simpul harus memiliki 0 atau 2 simpul, dan semua simpul daun harus berada pada tingkat atau tinggi yang sama. Contoh struktur pohon biner penuh di atas bukanlah Pohon Biner Sempurna karena simpul 6 dan simpul 1,2,3 tidak berada pada ketinggian yang sama. Namun contoh Pohon Biner Lengkap adalah pohon biner sempurna.
  • Pohon Biner yang Merosot: Setiap node hanya dapat memiliki satu anak. Semua operasi seperti pencarian, penyisipan, dan penghapusan membutuhkan waktu O(N).

Jenis Pohon Biner

  • Pohon Biner Seimbang: Di sini pohon biner ini, perbedaan tinggi subpohon kiri dan kanan paling banyak adalah 1. Jadi, saat menambah atau menghapus sebuah simpul, kita perlu menyeimbangkan kembali tinggi pohon tersebut. Jenis Pohon Biner Self-Balanced disebut Pohon AVL.

Jenis Pohon Biner

Ada tiga operasi dasar BST. Hal tersebut dibahas secara rinci di bawah ini.

Implementasi Pohon Biner di C dan C++

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct Node
{
   int value;
   struct Node *left, *right;
}
struct Node *getEmptynode(int val)
{
   struct Node *tempNode = (struct Node *)malloc(sizeof(struct Node));
   tempNode->value = val;
   tempNode->left = NULL;
   tempNode->right = NULL;
   return tempNode;
}
struct Node *successor(struct Node *node)
{
    struct Node *present = node;
// going to the left most node
    while (present != NULL && present->left != NULL)
    {
       present = present->left;
    }
     return present;
 }
struct Node *insert(struct Node *node, int value)
{
   if (node == NULL)
   {
      return getEmptynode(value);
   }
   if (value < node->value)
   {
      node->left = insert(node->left, value);
   }
   else
   {
      node->right = insert(node->right, value);
   }
      return node;
}
int searchInBST(struct Node *node, int value)
{
   struct Node *current = node;
   while (current->value != value)
    {
    if (current->value > value)
      {
      current = current->left;
      }
    else
     {
     current = current->right;
     }
   if (current == NULL)
     {
    return 0;
     }
   }
return 1;
}
void inorder(struct Node *root)
{
 if (root != NULL)
  {
   inorder(root->left);
   cout << root->value << " ";
   inorder(root->right);
  }
}
struct Node *deleteNode(struct Node *node, int value)
{
 if (node == NULL)
  {
   return node;
  }
 if (value < node->value)
  {
   node->left = deleteNode(node->left, value);
  }
else if (value > node->value)
 {
   node->right = deleteNode(node->right, value);
 }
else
{
if (node->left == NULL)
 {
 struct Node *temp = node->right;
 free(node);
 return temp;
 }
 else if (node->right == NULL)
 {
 struct Node *temp = node->left;
 free(node);
 return temp;
  }
 struct Node *temp = successor(node->right);
 node->value = temp->value;
 node->right = deleteNode(node->right, temp->value);
}
return node;
}
int main()
 {
  struct Node *root = NULL;
  root = insert(root, 8);
  root = insert(root, 4);
  root = insert(root, 12);
  root = insert(root, 2);
  root = insert(root, 6);
  root = insert(root, 10);
  root = insert(root, 14);
  root = insert(root, 1);
  root = insert(root, 3);
  root = insert(root, 5);
  root = insert(root, 7);
  root = insert(root, 9);
  root = insert(root, 11);
  root = insert(root, 13);
  root = insert(root, 15);

 cout << "InOrder Traversal after inserting all nodes: " << endl;
 inorder(root);
 root = insert(root, -10);
 cout << "\nInOrder Traversal after inserting -10 : " << endl;
 inorder(root);
 cout << "\nSearching -5 in the BST: " << searchInBST(root, -5) << endl;
 cout << "Searching -10 in the BST: " << searchInBST(root, -10) << endl;
 root = deleteNode(root,8);
 cout<<"After deleting node 8, inorder traversal: "<<endl;
 inorder(root);
 root = deleteNode(root,-10);
 cout<<"\nAfter deleting node -10, inorder traversal: "<<endl;
 inorder(root);
}

Keluaran:

InOrder Traversal after inserting all nodes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

InOrder Traversal after inserting -10 :
10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Searching -5 in the BST: 0
Searching -10 in the BST: 1

After deleting node 8, inorder traversal:
-10 1 2 3 4 5 6 7 9 10 11 12 13 14 15

After deleting node -10, inorder traversal:
1 2 3 4 5 6 7 9 10 11 12 13 14 15

Implementasi Pohon Biner di Python

class Node:
def __init__(self,value):
      self.left = None
      self.right = None
      self.value = value
def insert(root,value):
      if root == None:
          return Node(value)
      if value< root.value:
          root.left = insert(root.left,value)
      else:
          root.right = insert(root.right,value)
          return root
  def searchInBST(root,value):
      current = root
  while current.value != value:
  if current.value > value:
      current = current.left
  else:
      current = current.right
  if current == None:
      return "Not found"
      return "Found"
def inorder(root):
    if root != None:
      inorder(root.left)
      print(root.value,end=" ")
      inorder(root.right)
def successor(root):
    present = root
    while present != None and present.left != None:
    present = present.left
      return present
def deleteNode(root,value):
    if root == None:
      return root
    if value < root.value:
        root.left = deleteNode(root.left, value)
    elif value>root.value:
        root.right = deleteNode(root.right, value)
    else:
    if root.left == None:
        temp = root.right
        root = None
        return temp
    elif root.right == None:
        temp = root.left
        root = None
        return temp
        temp = successor(root.right)
        root.value = temp.value
        root.right = deleteNode(root.right, temp.value)
        return root
        root = Node(8)
        root = insert(root, 4)
        root = insert(root, 12)
        root = insert(root, 2)
        root = insert(root, 6)
        root = insert(root, 10)
        root = insert(root, 14)
        root = insert(root, 1)
        root = insert(root, 3)
        root = insert(root, 5)
        root = insert(root, 7)
        root = insert(root, 9)
        root = insert(root, 11)
        root = insert(root, 13)
        root = insert(root, 15)
  print("InOrder Traversal after inserting all nodes: ")
  inorder(root)
  root = insert(root, -10)
  print("\nInOrder Traversal after inserting -10 : ")
  inorder(root)
  print("\nSearching -5 in the BST: ",searchInBST(root, -5))
  print("Searching -5 in the BST: ",searchInBST(root, -10))
  root = deleteNode(root,8)
  print("After deleting node 8, inorder traversal:")
  inorder(root)
  root = deleteNode(root,-10)
  print("\nAfter deleting node -10, inorder traversal:")
  inorder(root)

Keluaran:

InOrder Traversal after inserting all nodes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

InOrder Traversal after inserting -10 : -10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

Searching -5 in the BST: Not found 

Searching -5 in the BST: Found After deleting node 8, inorder traversal: -10 1 2 3 4 5 6 7 9 10 11 12 13 14 15 

After deleting node -10, inorder traversal: 1 2 3 4 5 6 7 9 10 11 12 13 14 15

Penerapan Pohon Biner

Berikut adalah beberapa aplikasi umum dari Pohon Biner:

  • Mengatur data node dalam urutan yang diurutkan
  • Digunakan di peta dan mengatur objek node di perpustakaan bahasa pemrograman.
  • Mencari elemen dalam struktur data

» Pelajari tutorial kami berikutnya tentang Algoritma Kombinasi