Binarno stablo u strukturi podataka (PRIMJER)

ล to je binarno stablo?

Rijeฤ binarno znaฤi dvoje. U strukturi podataka stabla "Binarno stablo" znaฤi stablo u kojem svaki ฤvor moลพe imati najviลกe dva podreฤ‘ena ฤvora (lijevi i desni ฤvor). To je jednostavno binarno stablo.

Meฤ‘utim, postoji joลก jedno binarno stablo koje se najฤeลกฤ‡e koristi i ima nekoliko sluฤajeva upotrebe. Zove se binarno stablo pretraลพivanja (BST). Ovo stablo moลพe uฤiniti algoritam pretraลพivanja puno brลพim, toฤno log(n) vremensku sloลพenost. U strukturi podataka n oznaฤava broj ฤvorova u binarnom stablu.

Koje su razlike izmeฤ‘u binarnog stabla i binarnog stabla pretraลพivanja?

Razlika izmeฤ‘u BST i obiฤnog binarnog stabla je u tome ลกto BST lijevi ฤvor ima manju vrijednost od korijenskog ฤvora, a desni ฤvor ima veฤ‡u vrijednost od korijenskog ฤvora. Dakle, lijevo podstablo ฤ‡e uvijek sadrลพavati manju vrijednost od korijena, a desno podstablo ฤ‡e uvijek sadrลพavati veฤ‡u vrijednost od korijena.

Razlike izmeฤ‘u binarnog stabla i binarnog stabla pretraลพivanja

Primjer stabala binarnog pretraลพivanja

Uzmimo sljedeฤ‡i primjer za demonstraciju koncepata stabla binarnog pretraลพivanja.

Primjer stabala binarnog pretraลพivanja

Ovdje moลพete svi ฤvorovi slijediti zadanu disciplinu. Postoji formula za najveฤ‡i broj ฤvorova u stablu binarnog pretraลพivanja. Ako promatramo gornje stablo, moลพemo vidjeti da svaki ฤvor ima dva djeteta osim svih lisnih ฤvorova. A visina(h) zadanog binarnog stabla je 4. Formula je 2h - 1. Dakle, daje 15.

Primjer stabala binarnog pretraลพivanja

Primjer stabala binarnog pretraลพivanja

Gornja slika nije potpuno binarno stablo ili uravnoteลพeno binarno stablo, zove se potpuno binarno stablo ili uravnoteลพeno binarno stablo. Postoji joลก jedna struktura podataka koja se zove AVL (joลก jedna vrsta binarnog stabla) koja optimizira visinu binarnog stabla i brลพe izvodi pretragu za BST kao na slici 3.

Pokuลกajte izraฤunati obilazak gore navedenog binarnog stabla po redu. Vidjet ฤ‡ete da ฤ‡e dati sortirano polje koje se ne smanjuje, a algoritmi obilaska bit ฤ‡e isti kao i binarno stablo.

Vrste binarnog stabla

Evo nekoliko vaลพnih vrsta binarnog stabla:

  • Potpuno binarno stablo: Svaki ฤvor moลพe imati 0 ili 2 podreฤ‘ena ฤvora u ovom binarnom stablu. Samo jedan podreฤ‘eni ฤvor nije dopuลกten u ovoj vrsti binarnog stabla. Dakle, osim ฤvora lista, svi ฤvorovi ฤ‡e imati 2 djece.

Vrste binarnog stabla

  • Potpuno binarno stablo: Svaki ฤvor moลพe imati 0 ili 2 ฤvora. ฤŒini se kao potpuno binarno stablo, ali svi elementi listova naslonjeni su na lijevo podstablo, dok u punom binarnom stablu ฤvor moลพe biti u desnom ili lijevom podstablu.

Vrste binarnog stabla

  • Savrลกeno binarno stablo: Svi ฤvorovi moraju imati 0 ili 2 ฤvora, a svi ฤvorovi listova trebaju biti na istoj razini ili visini. Gornji primjer pune strukture binarnog stabla nije savrลกeno binarno stablo jer ฤvor 6 i ฤvor 1,2,3 nisu na istoj visini. Ali primjer potpunog binarnog stabla je savrลกeno binarno stablo.
  • Degenerirano binarno stablo: Svaki ฤvor moลพe imati samo jedno dijete. Sve operacije poput pretraลพivanja, umetanja i brisanja oduzimaju O(N) vremena.

Vrste binarnog stabla

  • Uravnoteลพeno binarno stablo: Ovdje u ovom binarnom stablu razlika u visini lijevog i desnog podstabla je najviลกe 1. Dakle, dok dodajemo ili briลกemo ฤvor, trebamo ponovno uravnoteลพiti visinu stabla. Ova vrsta samouravnoteลพenog binarnog stabla naziva se AVL stablo.

Vrste binarnog stabla

Tri su osnovne operacije BST-a. O njima se detaljno govori u nastavku.

Implementacija binarnog stabla u C i 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);
}

Izlaz:

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

Implementacija binarnog stabla u 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)

Izlaz:

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

Primjena binarnog stabla

Evo nekih uobiฤajenih primjena binarnog stabla:

  • Organiziranje podataka o ฤvorovima poredanim redoslijedom
  • Koristi se u objektima mapiranja i postavljanja ฤvorova u bibliotekama programskih jezika.
  • Traลพenje elemenata u strukturama podataka

ยป Saznajte o naลกem sljedeฤ‡em vodiฤu Algoritam kombinacije

Saลพmite ovu objavu uz: