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.
Primjer stabala binarnog pretraลพivanja
Uzmimo sljedeฤi primjer za demonstraciju koncepata stabla 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.
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.
- 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.
- 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.
- 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.
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







