Bináris fa az adatstruktúrában (PÉLDA)

⚡ Okos összefoglaló

A bináris fa az adatstruktúrában egy hierarchikus struktúra, ahol minden csomópontnak legfeljebb két gyermeke van, a bal és a jobb oldali. Ez az anyag ismerteti a bináris fákat, a bináris keresőfát, azok típusait, alkalmazásait és a teljes C nyelvet. C++és Python megvalósítások.

  • ???? Meghatározás: A bináris fa olyan struktúra, ahol minden csomópontnak legfeljebb két gyermekcsomópontja van, bal és jobb.
  • 🔍 Bináris keresési fa: Egy BST-ben a bal oldali gyermekek kisebb, a jobb oldali gyermekek pedig nagyobb értékeket tartalmaznak, lehetővé téve az O(log n) keresést.
  • 🧩 Típusok: A teljes, komplett, tökéletes, degenerált és kiegyensúlyozott bináris fák mindegyike eltérő alakszabályokat ír elő.
  • 🇧🇷 BST Operafeltételek: A beszúrás, keresés és törlés a rendezés tulajdonságot követi a keresések gyorsasága érdekében.
  • ???? Code Biztosítani: Munka C, C++és Python A programok bemutatják a beszúrás, keresés, törlés és rendezés közbeni bejárást.

Mi az a bináris fa?

A bináris szó kettőt jelent. A fa adatszerkezetében a „bináris fa” olyan fát jelent, amelyben minden csomópontnak maximum két gyermekcsomópontja lehet (bal és jobb oldali csomópont). Ez egy egyszerű bináris fa.

Van azonban egy másik bináris fa, amelyet a leggyakrabban használnak, és számos felhasználási esettel rendelkezik. Bináris keresőfának (BST) hívják. Ez a fa sokkal gyorsabbá teheti a keresési algoritmust, pontosan log(n) időbonyolítással. Az adatstruktúrában n a bináris fa csomópontjainak számát jelenti.

Mi a különbség a bináris fa és a bináris keresőfa között?

A BST és a normál bináris fa közötti különbség abban van, hogy a BST bal oldali csomópont értéke kisebb, mint a gyökércsomóponté, a jobb oldali pedig nagyobb, mint a gyökércsomóponté. Tehát a bal oldali részfa mindig kisebb értéket fog tartalmazni, mint a gyökér, a jobb oldali részfa pedig mindig nagyobb értéket fog tartalmazni, mint a gyökér.

A bináris fa és a bináris keresőfa közötti különbségek

Példa bináris keresőfákra

Nézzük a következő példát a bináris keresőfa fogalmainak bemutatására.

Példa bináris keresőfákra

Itt minden csomópont követheti az adott diszciplínát. Van egy képlet a csomópontok maximális számához a bináris keresőfában. Ha megfigyeljük a fenti fát, láthatjuk, hogy minden csomópontnak két gyermeke van, kivéve az összes levélcsomópontot. Az adott bináris fa magassága(h) pedig 4. A képlet az 2h - 1. Tehát 15-öt ad.

Példa bináris keresőfákra

Példa bináris keresőfákra

A fenti kép nem egy teljes bináris fa vagy kiegyensúlyozott bináris fa, hanem teljes bináris fának vagy kiegyensúlyozott bináris fának nevezik. Van egy másik adatstruktúra, az AVL (egy másik típusú bináris fa), amely optimalizálja a bináris fa magasságát, és gyorsabban keresi a BST-t, mint a 3. ábrán.

Próbálja kiszámolni a fent megadott bináris fa sorrendben történő bejárását. Látni fogja, hogy nem csökkenő rendezett tömböt ad, és a bejárási algoritmusok megegyeznek a bináris fával.

A bináris fa típusai

Íme néhány fontos bináris fa típus:

  • Teljes bináris fa: Ebben a bináris fában minden csomópontnak 0 vagy 2 gyermekcsomópontja lehet. Csak egy gyermek csomópont nem engedélyezett az ilyen típusú bináris fákban. Tehát a levél csomópont kivételével minden csomópontnak 2 gyermeke lesz.

A bináris fa típusai

  • Teljes bináris fa: Minden csomópontnak lehet 0 vagy 2 csomópontja. Úgy tűnik, mint a teljes bináris fa, de az összes levélelem a bal oldali részfához hajlik, míg a teljes bináris fa csomópontja lehet a jobb vagy a bal részfában.

A bináris fa típusai

  • Tökéletes bináris fa: Minden csomópontnak 0 vagy 2 csomóponttal kell rendelkeznie, és az összes levélcsomópontnak azonos szinten vagy magasságban kell lennie. A teljes bináris faszerkezet fenti példája nem egy tökéletes bináris fa, mivel a 6. és az 1,2,3, XNUMX, XNUMX csomópont nem azonos magasságban van. De a teljes bináris fa példája egy tökéletes bináris fa.
  • Degenerált bináris fa: Minden csomópontnak csak egyetlen gyermeke lehet. Minden művelet, például a keresés, beszúrás és törlés O(N) időt vesz igénybe.

A bináris fa típusai

  • Kiegyensúlyozott bináris fa: Itt ez a bináris fa, a bal és jobb részfa magasságkülönbsége legfeljebb 1. Tehát egy csomópont hozzáadása vagy törlése közben ismét ki kell egyensúlyoznunk a fa magasságát. Az önkiegyensúlyozott bináris fának ezt a típusát a AVL fa.

A bináris fa típusai

A BST-nek három alapvető művelete van. Ezeket az alábbiakban részletesen tárgyaljuk.

A bináris fa megvalósítása C-ben és 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);
}

output:

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

A bináris fa implementációja 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)

output:

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

A bináris fa alkalmazása

Íme a Binary Tree néhány gyakori alkalmazása:

  • Csomóponti adatok rendezése rendezett sorrendben
  • A programozási nyelvi könyvtárak leképezésében és beállítási csomóponti objektumaiban használatos.
  • Elemek keresése az adatstruktúrákban

» Ismerje meg következő oktatóanyagunkat Kombinációs algoritmus

GYIK

Egy csomópont mélysége a gyökértől az adott csomópontig vezető élek száma. Egy csomópont magassága a tőle egy levélig vezető leghosszabb útvonalon lévő élek száma. A fa magassága megegyezik a gyökér magasságával.

Egy bináris fa minden csomópontot csak két gyermekre korlátoz, így kiegyensúlyozatlanná és lassúvá válhat. Az AVL fa egy önkiegyensúlyozó bináris keresőfa, amely az alfák magasságkülönbségét egyen belül tartja, garantálva az O(log n) műveletet.

Egy bináris fa tömbben tárolható úgy, hogy a gyökeret a 0. indexre helyezzük. Az i-edik indexű csomópont bal oldali gyermeke a 2i+1, jobb oldali gyermeke pedig a 2i+2 indexen található. Ez a módszer a teljes bináris fákhoz illik a legjobban.

A mesterséges intelligencia eszközei képesek értékek vagy kódok listáját interaktív bináris fadiagrammá alakítani, kiemelve a csomópontokat beszúrás, keresés vagy törlés közben. Ez segít a kezdőknek abban, hogy lássák, hogyan változik a struktúra az egyes műveletek során.

Igen. A mesterséges intelligencia által fejlesztett kódolóasszisztensek bináris fát és BST kódot tudnak generálni – beszúrás, keresés, törlés és bejárás – olyan nyelveken, mint a C++, Pythonés Java. RevTekintse meg és tesztelje a kimenetet, mivel a mesterséges intelligencia kihagyhat olyan szélsőséges eseteket, mint például a duplikátumok.

Foglald össze ezt a bejegyzést a következőképpen: