Binääripuu tietorakenteessa (ESIMERKKI)

Mikä on binääripuu?

Sana binääri tarkoittaa kahta. Puutietorakenteessa "Binary Tree" tarkoittaa puuta, jossa jokaisessa solmussa voi olla enintään kaksi lapsisolmua (vasen ja oikea solmu). Se on yksinkertainen binääripuu.

On kuitenkin toinen binääripuu, jota käytetään useimmin ja jolla on useita käyttötapauksia. Sitä kutsutaan binäärihakupuuksi (BST). Tämä puu voi tehdä hakualgoritmista paljon nopeammaksi, tarkalleen log(n)-ajan monimutkaisuuden. Tietorakenteessa n tarkoittaa binääripuun solmujen määrää.

Mitä eroa on binääripuun ja binaarihakupuun välillä?

Ero BST:n ja tavallisen binaaripuun välillä on siinä, että BST:n vasemmalla solmulla on pienempi arvo kuin juurisolmulla ja oikealla solmulla on suurempi arvo kuin juurisolmulla. Vasen alipuu sisältää siis aina pienemmän arvon kuin juuri ja oikea alipuu aina suuremman arvon kuin juuri.

Erot binaaripuun ja binaarihakupuun välillä

Esimerkki binaarisista hakupuista

Otetaan seuraava esimerkki binaarihakupuun käsitteiden havainnollistamiseksi.

Esimerkki binaarisista hakupuista

Täällä voit kaikki solmut noudattaa annettua kurinalaisuutta. Binäärihakupuussa on kaava solmujen enimmäismäärälle. Jos tarkkailemme yllä olevaa puuta, voimme nähdä, että jokaisella solmulla on kaksi lasta paitsi kaikkia lehtien solmuja. Ja annetun binääripuun korkeus(h) on 4. Kaava on 2h - 1. Joten se antaa 15.

Esimerkki binaarisista hakupuista

Esimerkki binaarisista hakupuista

Yllä oleva kuva ei ole täydellinen binaaripuu tai tasapainotettu binaaripuu, sitä kutsutaan täydelliseksi binaaripuuksi tai tasapainotetuksi binaaripuuksi. On olemassa toinen tietorakenne nimeltä AVL (toinen binaaripuu), joka optimoi binääripuun korkeuden ja suorittaa BST-haun nopeammin, kuten kuvassa 3.

Yritä laskea edellä esitetyn binääripuun järjestyksessä kulkeminen. Tulet huomaamaan, että se antaa ei-vähenevän lajitellun taulukon, ja Traversal-algoritmit ovat samat kuin binääripuu.

Binaaripuun tyypit

Tässä on joitain tärkeitä binääripuutyyppejä:

  • Täysi binääripuu: Jokaisella solmulla voi olla 0 tai 2 lapsisolmua tässä binääripuussa. Vain yksi lapsisolmu ei ole sallittu tämän tyyppisessä binääripuussa. Joten lehtisolmua lukuun ottamatta kaikilla solmuilla on 2 lasta.

Binaaripuun tyypit

  • Täysi binääripuu: Jokaisessa solmussa voi olla 0 tai 2 solmua. Näyttää siltä, ​​​​että koko binääripuu, mutta kaikki lehtielementit ovat kallistuneet vasempaan alipuuhun, kun taas täydessä binääripuussa solmu voi olla oikeassa tai vasemmassa alipuussa.

Binaaripuun tyypit

  • Täydellinen binääripuu: Kaikissa solmuissa on oltava 0 tai 2 solmua, ja kaikkien lehtien solmujen tulee olla samalla tasolla tai korkeudella. Yllä oleva esimerkki täydellisestä binääripuurakenteesta ei ole täydellinen binaaripuu, koska solmu 6 ja solmu 1,2,3 eivät ole samalla korkeudella. Mutta esimerkki täydellisestä binääripuusta on täydellinen binääripuu.
  • Degeneroitunut binääripuu: Jokaisella solmulla voi olla vain yksi lapsi. Kaikki toiminnot, kuten etsiminen, lisääminen ja poistaminen, vievät O(N) aikaa.

Binaaripuun tyypit

  • Tasapainotettu binääripuu: Tässä binääripuussa vasemman ja oikean alipuun korkeusero on korkeintaan 1. Joten lisättäessä tai poistaessamme solmua meidän on tasapainotettava puun korkeus uudelleen. Tämän tyyppistä itsetasapainoista binaaripuuta kutsutaan nimellä AVL-puu.

Binaaripuun tyypit

BST:ssä on kolme perustoimintoa. Niitä käsitellään yksityiskohtaisesti alla.

Binaaripuun toteutus C:ssä ja 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);
}

lähtö:

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

Binaaripuun käyttöönotto 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)

lähtö:

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

Binaaripuun sovellus

Tässä on joitain Binary Treen yleisiä sovelluksia:

  • Solmutietojen järjestäminen lajiteltuun järjestykseen
  • Käytetään ohjelmointikielikirjastojen kartassa ja solmuobjekteissa.
  • Elementtien etsiminen tietorakenteista

» Opi seuraavasta opetusohjelmastamme Yhdistelmäalgoritmi