logo

Attraversamento dell'ordine dei livelli (Breadth First Search o BFS) dell'albero binario

Attraversamento dell'ordine di livello La tecnica è definita come un metodo per attraversare un albero in modo tale che tutti i nodi presenti nello stesso livello vengano attraversati completamente prima di attraversare il livello successivo.

BFS_1albero



Esempio:

Ingresso:



Produzione:
1
23
Quattro cinque

Attraversamento dell'ordine del livello di pratica consigliato Provalo!

Come funziona l'attraversamento dell'ordine di livello?

L'idea principale dell'attraversamento dell'ordine di livello è quella di attraversare tutti i nodi di un livello inferiore prima di spostarsi su uno qualsiasi dei nodi di un livello superiore. Questo può essere fatto in uno dei seguenti modi:

  • quello ingenuo (trovare l'altezza dell'albero e attraversare ogni livello e stampare i nodi di quel livello)
  • utilizzando in modo efficiente una coda.

Attraversamento dell'ordine di livello (approccio naive):

Trovare altezza di albero. Quindi, per ciascun livello, esegui una funzione ricorsiva mantenendo l'altezza corrente. Ogni volta che il livello di un nodo corrisponde, stampa quel nodo.



Di seguito è riportata l’implementazione dell’approccio di cui sopra:

C++
// Recursive CPP program for level // order traversal of Binary Tree #include  using namespace std; // A binary tree node has data, // pointer to left child // and a pointer to right child class node { public:  int data;  node *left, *right; }; // Function prototypes void printCurrentLevel(node* root, int level); int height(node* node); node* newNode(int data); // Function to print level order traversal a tree void printLevelOrder(node* root) {  int h = height(root);  int i;  for (i = 1; i <= h; i++)  printCurrentLevel(root, i); } // Print nodes at a current level void printCurrentLevel(node* root, int level) {  if (root == NULL)  return;  if (level == 1)  cout << root->dati<< ' ';  else if (level>1) { stampaLivelloCorrente(root->sinistra, livello - 1);  stampaLivelloCorrente(radice->destra, livello - 1);  } } // Calcola l''altezza' di un albero: il numero di // nodi lungo il percorso più lungo dal nodo radice // fino al nodo foglia più lontano. int altezza(nodo* nodo) { if (nodo == NULL) return 0;  else { // Calcola l'altezza di ogni sottoalbero int lheight = Height(node->left);  int rheight = altezza(nodo->destra);  // Usa quello più grande if (lheight> rheight) { return (lheight + 1);  } else { return (destra + 1);  } } } // Funzione di supporto che alloca // un nuovo nodo con i dati specificati e // puntatori NULL sinistro e destro. nodo* nuovoNodo(int dati) { nodo* Nodo = nuovo nodo();  Nodo->dati = dati;  Nodo->sinistra = NULL;  Nodo->destra = NULL;  ritorno (Nodo); } // Codice driver int main() { node* root = newNode(1);  radice->sinistra = nuovoNodo(2);  radice->destra = nuovoNodo(3);  radice->sinistra->sinistra = nuovoNodo(4);  radice->sinistra->destra = nuovoNodo(5);  cout<< 'Level Order traversal of binary tree is 
';  printLevelOrder(root);  return 0; } // This code is contributed by rathbhupendra>
C
// Recursive C program for level // order traversal of Binary Tree #include  #include  // A binary tree node has data, // pointer to left child // and a pointer to right child struct node {  int data;  struct node *left, *right; }; // Function prototypes void printCurrentLevel(struct node* root, int level); int height(struct node* node); struct node* newNode(int data); // Function to print level order traversal a tree void printLevelOrder(struct node* root) {  int h = height(root);  int i;  for (i = 1; i <= h; i++)  printCurrentLevel(root, i); } // Print nodes at a current level void printCurrentLevel(struct node* root, int level) {  if (root == NULL)  return;  if (level == 1)  printf('%d ', root->dati);  else if (livello> 1) { printCurrentLevel(root->left, level - 1);  stampaLivelloCorrente(radice->destra, livello - 1);  } } // Calcola l''altezza' di un albero -- il numero di // nodi lungo il percorso più lungo dal nodo radice // fino al nodo foglia più lontano int Height(struct node* node) { if (node == NULL) restituisce 0;  else { // Calcola l'altezza di ogni sottoalbero int lheight = Height(node->left);  int rheight = altezza(nodo->destra);  // Usa quello più grande if (lheight> rheight) return (lheight + 1);  altrimenti ritorna (destra + 1);  } } // Funzione di supporto che alloca un nuovo nodo con i // dati forniti e puntatori NULL sinistro e destro. struct node* newNode(int data) { struct node* node = (struct node*)malloc(sizeof(struct node));  nodo->dati = dati;  nodo->sinistra = NULL;  nodo->destra = NULL;  ritorno (nodo); } // Programma driver per testare le funzioni di cui sopra int main() { struct node* root = newNode(1);  radice->sinistra = nuovoNodo(2);  radice->destra = nuovoNodo(3);  radice->sinistra->sinistra = nuovoNodo(4);  radice->sinistra->destra = nuovoNodo(5);  printf('L'attraversamento dell'ordine di livello dell'albero binario è 
');  stampaOrdineLivello(root);  restituire 0; }>
Giava
// Recursive Java program for level // order traversal of Binary Tree // Class containing left and right child of current // node and key value class Node {  int data;  Node left, right;  public Node(int item)  {  data = item;  left = right = null;  } } class BinaryTree {    // Root of the Binary Tree  Node root;  public BinaryTree() { root = null; }  // Function to print level order traversal of tree  void printLevelOrder()  {  int h = height(root);  int i;  for (i = 1; i <= h; i++)  printCurrentLevel(root, i);  }  // Compute the 'height' of a tree -- the number of  // nodes along the longest path from the root node  // down to the farthest leaf node.  int height(Node root)  {  if (root == null)  return 0;  else {    // Compute height of each subtree  int lheight = height(root.left);  int rheight = height(root.right);  // use the larger one  if (lheight>altezza dx) ritorno (altezza lx + 1);  altrimenti ritorna (destra + 1);  } } // Stampa i nodi al livello corrente void printCurrentLevel(Node root, int level) { if (root == null) return;  if (livello == 1) System.out.print(root.data + ' ');  else if (livello> 1) { printCurrentLevel(root.left, livello - 1);  stampaLivelloCorrente(root.right, livello - 1);  } } // Programma driver per testare le funzioni di cui sopra public static void main(String args[]) { BinaryTree tree = new BinaryTree();  albero.root = nuovo nodo(1);  tree.root.left = nuovo nodo(2);  tree.root.right = nuovo nodo(3);  tree.root.left.left = nuovo nodo(4);  tree.root.left.right = nuovo nodo(5);  System.out.println('L'attraversamento dell'ordine dei livelli di' + 'albero binario è ');  tree.printLevelOrder();  } }>
Pitone
# Recursive Python program for level # order traversal of Binary Tree # A node structure class Node: # A utility function to create a new node def __init__(self, key): self.data = key self.left = None self.right = None # Function to print level order traversal of tree def printLevelOrder(root): h = height(root) for i in range(1, h+1): printCurrentLevel(root, i) # Print nodes at a current level def printCurrentLevel(root, level): if root is None: return if level == 1: print(root.data, end=' ') elif level>1: printCurrentLevel(root.left, level-1) printCurrentLevel(root.right, level-1) # Calcola l'altezza di un albero: il numero di nodi # lungo il percorso più lungo dal nodo radice fino # alla foglia più lontana node def altezza(nodo): se il nodo è None: return 0 else: # Calcola l'altezza di ogni sottoalbero lheight = altezza(nodo.sinistra) rheight = altezza(nodo.destra) # Usa quello più grande se lheight> rheight: return lheight+1 else: return rheight+1 # Programma driver per testare la funzione sopra if __name__ == '__main__': root = Node(1) root.left = Node(2) root.right = Node(3) root. left.left = Node(4) root.left.right = Node(5) print('L'attraversamento dell'ordine di livello dell'albero binario è -') printLevelOrder(root) # Questo codice è stato fornito da Nikhil Kumar Singh(nickzuck_007)> 
C#
// Recursive c# program for level // order traversal of Binary Tree using System; // Class containing left and right // child of current node and key value public class Node {  public int data;  public Node left, right;  public Node(int item)  {  data = item;  left = right = null;  } } class GFG {  // Root of the Binary Tree  public Node root;  public void BinaryTree() { root = null; }  // Function to print level order  // traversal of tree  public virtual void printLevelOrder()  {  int h = height(root);  int i;  for (i = 1; i <= h; i++) {  printCurrentLevel(root, i);  }  }  // Compute the 'height' of a tree --  // the number of nodes along the longest  // path from the root node down to the  // farthest leaf node.  public virtual int height(Node root)  {  if (root == null) {  return 0;  }  else {  // Compute height of each subtree  int lheight = height(root.left);  int rheight = height(root.right);  // use the larger one  if (lheight>altezza destra) { return (altezza sinistra + 1);  } else { return (destra + 1);  } } } // Stampa i nodi al livello corrente public virtual void printCurrentLevel(Node root, int level) { if (root == null) { return;  } if (livello == 1) { Console.Write(root.data + ' ');  } else if (livello> 1) { printCurrentLevel(root.left, livello - 1);  stampaLivelloCorrente(root.right, livello - 1);  } } // Codice driver public static void Main(string[] args) { GFG tree = new GFG();  albero.root = nuovo nodo(1);  tree.root.left = nuovo nodo(2);  tree.root.right = nuovo nodo(3);  tree.root.left.left = nuovo nodo(4);  tree.root.left.right = nuovo nodo(5);  Console.WriteLine('L'attraversamento dell'ordine dei livelli ' + 'dell'albero binario è ');  tree.printLevelOrder();  } } // Questo codice è un contributo di Shrikant13>
Javascript
// Recursive javascript program for level // order traversal of Binary Tree // Class containing left and right child of current // node and key value  class Node {  constructor(val) {  this.data = val;  this.left = null;  this.right = null;  }  }  // Root of the Binary Tree  var root= null;    // Function to print level order traversal of tree  function printLevelOrder() {  var h = height(root);  var i;  for (i = 1; i <= h; i++)  printCurrentLevel(root, i);  }  // Compute the 'height' of a tree -- the number   // of nodes along the longest path  // from the root node down to the farthest leaf node.  function height(root) {  if (root == null)  return 0;  else {  // Compute height of each subtree  var lheight = height(root.left);  var rheight = height(root.right);  // Use the larger one  if (lheight>altezza dx) ritorno (altezza lx + 1);  altrimenti ritorna (destra + 1);  } } // Stampa i nodi al livello corrente function printCurrentLevel(root, level) { if (root == null) return;  if (livello == 1) console.log(root.data + ' ');  else if (livello> 1) { printCurrentLevel(root.left, livello - 1);  stampaLivelloCorrente(root.right, livello - 1);  } } // Programma driver per testare le funzioni sopra root = new Node(1);  root.left = nuovo nodo(2);  root.right = nuovo nodo(3);  root.left.left = nuovo nodo(4);  root.left.right = nuovo nodo(5);  console.log('L'attraversamento dell'ordine di livello dell'albero binario è ');  stampaOrdineLivello(); // Questo codice è un contributo di umadevi9616>

Produzione
Level Order traversal of binary tree is 1 2 3 4 5>

Complessità temporale: O(N), dove N è il numero di nodi nell'albero distorto.
Spazio ausiliario: O(1) Se si considera lo stack di ricorsione lo spazio utilizzato è O(N).

chiave primaria e chiave composita in sql

Attraversamento dell'ordine di livello utilizzando Coda

Dobbiamo visitare i nodi di livello inferiore prima di qualsiasi nodo di livello superiore, questa idea è abbastanza simile a quella di una coda. Spingere i nodi di livello inferiore nella coda. Quando viene visitato un nodo, estrai quel nodo dalla coda e spingi il figlio di quel nodo nella coda.

Ciò garantisce che il nodo di livello inferiore venga visitato prima di qualsiasi nodo di livello superiore.

Di seguito è riportata l’implementazione dell’approccio di cui sopra:

C++
// C++ program to print level order traversal #include  using namespace std; // A Binary Tree Node struct Node {  int data;  struct Node *left, *right; }; // Iterative method to find height of Binary Tree void printLevelOrder(Node* root) {  // Base Case  if (root == NULL)  return;  // Create an empty queue for level order traversal  queueQ;  // Accoda Root e inizializza l'altezza q.push(root);  while (q.empty() == false) { // Stampa la parte anteriore della coda e rimuovila dalla coda Node* node = q.front();  cout<< node->dati<< ' ';  q.pop();  // Enqueue left child  if (node->sinistra != NULL) q.push(nodo->sinistra);  // Accoda il figlio destro if (node->right != NULL) q.push(node->right);  } } // Funzione di utilità per creare un nuovo nodo dell'albero Node* newNode(int data) { Node* temp = new Node;  temp->dati = dati;  temp->sinistra = temp->destra = NULL;  temperatura di ritorno; } // Programma driver per testare le funzioni di cui sopra int main() { // Creiamo l'albero binario mostrato nel diagramma sopra Node* root = newNode(1);  radice->sinistra = nuovoNodo(2);  radice->destra = nuovoNodo(3);  radice->sinistra->sinistra = nuovoNodo(4);  radice->sinistra->destra = nuovoNodo(5);  cout<< 'Level Order traversal of binary tree is 
';  printLevelOrder(root);  return 0; }>
C
// Iterative Queue based C program // to do level order traversal // of Binary Tree #include  #include  #define MAX_Q_SIZE 500 // A binary tree node has data, // pointer to left child // and a pointer to right child struct node {  int data;  struct node* left;  struct node* right; }; // Function prototypes struct node** createQueue(int*, int*); void enQueue(struct node**, int*, struct node*); struct node* deQueue(struct node**, int*); // Given a binary tree, print its nodes in level order // using array for implementing queue void printLevelOrder(struct node* root) {  int rear, front;  struct node** queue = createQueue(&front, &rear);  struct node* temp_node = root;  while (temp_node) {  printf('%d ', temp_node->dati);  // Accoda il figlio sinistro if (temp_node->left) enQueue(queue, &rear, temp_node->left);  // Accoda il figlio destro if (temp_node->right) enQueue(queue, &rear, temp_node->right);  // Rimuove il nodo dalla coda e lo rende temp_node temp_node = deQueue(queue, &front);  } } // Funzioni di utilità struct node** createQueue(int* front, int* posterior) { struct node** coda = (struct node**)malloc( sizeof(struct node*) * MAX_Q_SIZE);  *anteriore = *posteriore = 0;  coda di ritorno; } void enQueue(struct node** coda, int* posteriore, struct node* nuovo_nodo) { coda[*posteriore] = nuovo_nodo;  (*posteriore)++; } struct node* deQueue(struct node** coda, int* front) { (*front)++;  coda di ritorno[*front - 1]; } // Funzione di supporto che alloca un nuovo nodo con i // dati forniti e puntatori NULL sinistro e destro. struct node* newNode(int data) { struct node* node = (struct node*)malloc(sizeof(struct node));  nodo->dati = dati;  nodo->sinistra = NULL;  nodo->destra = NULL;  ritorno (nodo); } // Programma driver per testare le funzioni di cui sopra int main() { struct node* root = newNode(1);  radice->sinistra = nuovoNodo(2);  radice->destra = nuovoNodo(3);  radice->sinistra->sinistra = nuovoNodo(4);  radice->sinistra->destra = nuovoNodo(5);  printf('L'attraversamento dell'ordine di livello dell'albero binario è 
');  stampaOrdineLivello(root);  restituire 0; }>
Giava
// Iterative Queue based Java program // to do level order traversal // of Binary Tree import java.util.LinkedList; import java.util.Queue; // Class to represent Tree node class Node {  int data;  Node left, right;  public Node(int item)  {  data = item;  left = null;  right = null;  } } // Class to print Level Order Traversal class BinaryTree {  Node root;  // Given a binary tree. Print  // its nodes in level order  // using array for implementing queue  void printLevelOrder()  {  Queuecoda = nuova Lista Collegata();  coda.add(root);  while (!queue.isEmpty()) { // poll() rimuove l'intestazione attuale.   Nodo tempNode = coda.poll();  System.out.print(tempNode.data + ' ');  // Accoda il figlio sinistro if (tempNode.left!= null) { tail.add(tempNode.left);  } // Accoda il figlio destro if (tempNode.right != null) { Queue.add(tempNode.right);  } } } public static void main(String args[]) { // Creazione di un albero binario e immissione // dei nodi BinaryTree tree_level = new BinaryTree();  tree_level.root = nuovo nodo(1);  tree_level.root.left = nuovo nodo(2);  tree_level.root.right = nuovo nodo(3);  tree_level.root.left.left = nuovo nodo(4);  tree_level.root.left.right = nuovo nodo(5);  System.out.println('L'attraversamento dell'ordine di livello dell'albero binario è - ');  tree_level.printLevelOrder();  } }>
Pitone
# Python program to print level # order traversal using Queue # A node structure class Node: # A utility function to create a new node def __init__(self, key): self.data = key self.left = None self.right = None # Iterative Method to print the # height of a binary tree def printLevelOrder(root): # Base Case if root is None: return # Create an empty queue # for level order traversal queue = [] # Enqueue Root and initialize height queue.append(root) while(len(queue)>0): # Stampa la parte anteriore della coda e # la rimuove dalla coda print(queue[0].data, end=' ') node = Queue.pop(0) # Accoda il figlio sinistro se node.left non è Nessuno: Queue.append(node.left) # Accoda il figlio destro se node.right non è Nessuno: Queue.append(node.right) # Programma driver per testare la funzione precedente if __name__ == '__main__': root = Node(1 ) radice.sinistra = Nodo(2) radice.destra = Nodo(3) radice.sinistra.sinistra = Nodo(4) radice.sinistra.destra = Nodo(5) print('L'attraversamento dell'ordine di livello dell'albero binario è - ') printLevelOrder(root) # Questo codice è un contributo di Nikhil Kumar Singh(nickzuck_007)>
C#
// Iterative Queue based C# program // to do level order traversal // of Binary Tree using System; using System.Collections.Generic; // Class to represent Tree node public class Node {  public int data;  public Node left, right;  public Node(int item)  {  data = item;  left = null;  right = null;  } } // Class to print Level Order Traversal public class BinaryTree {  Node root;  // Given a binary tree. Print  // its nodes in level order using  // array for implementing queue  void printLevelOrder()  {  Queuecoda = nuova coda();  coda.Enqueue(root);  while (queue.Count!= 0) { Nodo tempNode = coda.Dequeue();  Console.Write(tempNode.data + ' ');  // Accoda il figlio sinistro if (tempNode.left!= null) { tail.Enqueue(tempNode.left);  } // Accoda il figlio destro if (tempNode.right != null) { tail.Enqueue(tempNode.right);  } } } // Codice driver public static void Main() { // Creazione di un albero binario e immissione // dei nodi BinaryTree tree_level = new BinaryTree();  tree_level.root = nuovo nodo(1);  tree_level.root.left = nuovo nodo(2);  tree_level.root.right = nuovo nodo(3);  tree_level.root.left.left = nuovo nodo(4);  tree_level.root.left.right = nuovo nodo(5);  Console.WriteLine('L'attraversamento dell'ordine dei livelli ' + 'dell'albero binario è - ');  tree_level.printLevelOrder();  } } // Questo codice è stato fornito da PrinciRaj1992>
Javascript
class Node {  constructor(val) {  this.data = val;  this.left = null;  this.right = null;  } } // Class to represent a deque (double-ended queue) class Deque {  constructor() {  this.queue = [];  }  // Method to add an element to the end of the queue  enqueue(item) {  this.queue.push(item);  }  // Method to remove and return the first element of the queue  dequeue() {  return this.queue.shift();  }  // Method to check if the queue is empty  isEmpty() {  return this.queue.length === 0;  } } // Function to perform level order traversal of a binary tree function printLevelOrder(root) {  // Create a deque to store nodes for traversal  const queue = new Deque();  // Add the root node to the queue  queue.enqueue(root);  // Continue traversal until the queue is empty  while (!queue.isEmpty()) {  // Remove and get the first node from the queue  const tempNode = queue.dequeue();  // Print the data of the current node  console.log(tempNode.data + ' ');  // Enqueue the left child if it exists  if (tempNode.left !== null) {  queue.enqueue(tempNode.left);  }  // Enqueue the right child if it exists  if (tempNode.right !== null) {  queue.enqueue(tempNode.right);  }  } } // Create a binary tree and enter the nodes const root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); // Print the level order traversal of the binary tree console.log('Level order traversal of binary tree is - '); printLevelOrder(root);>

Produzione
Level Order traversal of binary tree is 1 2 3 4 5>

Complessità temporale: O(N) dove N è il numero di nodi nell'albero binario.
Spazio ausiliario: O(N) dove N è il numero di nodi nell'albero binario.