logo

Nivårekkefølge (Bredth First Search eller BFS) av binært tre

Nivå ordregjennomgang teknikk er definert som en metode for å krysse et tre slik at alle noder tilstede på samme nivå krysses fullstendig før de krysser neste nivå.

BFS_1tre



Eksempel:

Inndata:



Produksjon:
1
23
Fire fem

Anbefalt praksis Nivåbestillingsgjennomgang Prøv det!

Hvordan fungerer Level Order Traversal?

Hovedideen med gjennomgang av nivårekkefølge er å krysse alle nodene på et lavere nivå før du flytter til noen av nodene på et høyere nivå. Dette kan gjøres på en av følgende måter:

  • den naive (finne høyden på treet og krysse hvert nivå og skrive ut nodene til det nivået)
  • effektivt ved å bruke en kø.

Nivåbestillingsgjennomgang (naiv tilnærming):

Finne høyde av treet. Kjør deretter en rekursiv funksjon for hvert nivå ved å opprettholde gjeldende høyde. Når nivået til en node samsvarer, skriv ut den noden.



Nedenfor er implementeringen av tilnærmingen ovenfor:

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->data<< ' ';  else if (level>1) { printCurrentLevel(root->venstre, nivå - 1);  printCurrentLevel(root->right, level - 1);  } } // Beregn 'høyden' til et tre -- antall // noder langs den lengste banen fra rotnoden // ned til den lengste bladnoden. int height(node* node) { if (node ​​== NULL) returner 0;  else { // Beregn høyden til hvert undertre int lheight = height(node->venstre);  int høyre = høyde(node->høyre);  // Bruk den større hvis (lheight> rheight) { return (lheight + 1);  } else { return (høyre + 1);  } } } // Hjelpefunksjon som tildeler // en ny node med de gitte dataene og // NULL venstre og høyre pekere. node* newNode(int data) { node* Node = ny node();  Node->data = data;  Node->venstre = NULL;  Node->høyre = NULL;  retur (Node); } // Driverkode int main() { node* root = newNode(1);  root->venstre = nyNode(2);  root->right = newNode(3);  root->venstre->venstre = nyNode(4);  root->venstre->høyre = nyNode(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->data);  else if (nivå> 1) { printCurrentLevel(root->venstre, nivå - 1);  printCurrentLevel(root->right, level - 1);  } } // Beregn 'høyden' til et tre -- antall // noder langs den lengste banen fra rotnoden // ned til den lengste bladnoden int height(struct node* node) { if (node) == NULL) returner 0;  else { // Beregn høyden til hvert undertre int lheight = height(node->venstre);  int høyre = høyde(node->høyre);  // Bruk den større hvis (lheight> rheight) return (lheight + 1);  annet retur (høyre + 1);  } } // Hjelpefunksjon som tildeler en ny node med // gitte data og NULL venstre og høyre pekere. struct node* newNode(int data) { struct node* node = (struct node*)malloc(sizeof(struct node));  node->data = data;  node->venstre = NULL;  node->høyre = NULL;  retur (node); } // Driverprogram for å teste funksjonene ovenfor int main() { struct node* root = newNode(1);  root->venstre = nyNode(2);  root->right = newNode(3);  root->venstre->venstre = nyNode(4);  root->venstre->høyre = nyNode(5);  printf('Nivårekkefølge-gjennomgang av binært tre er 
');  printLevelOrder(root);  returner 0; }>
Java
// 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>rheight) return (lheight + 1);  annet retur (høyre + 1);  } } // Skriv ut noder på gjeldende nivå void printCurrentLevel(Noderot, int nivå) { if (root == null) return;  if (nivå == 1) System.out.print(root.data + ' ');  else if (nivå> 1) { printCurrentLevel(root.left, level - 1);  printCurrentLevel(root.right, nivå - 1);  } } // Driverprogram for å teste funksjonene ovenfor public static void main(String args[]) { BinaryTree tree = new BinaryTree();  tree.root = ny node(1);  tree.root.left = ny node(2);  tree.root.right = ny node(3);  tree.root.left.left = ny node(4);  tree.root.left.right = ny node(5);  System.out.println('Nivårekkefølgegjennomgang av' + 'binært tre er ');  tree.printLevelOrder();  } }>
Python
# 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) # Beregn høyden på et tre--antall noder # langs den lengste banen fra rotnoden ned til # det fjerneste bladet node def høyde(node): hvis node er Ingen: returner 0 annet: # Beregn høyden til hvert undertre lheight = height(node.left) rheight = height(node.right) # Bruk den største hvis lheight> rheight: returner lheight+1 else: return rheight+1 # Driverprogram for å teste funksjonen ovenfor hvis __name__ == '__main__': root = Node(1) root.left = Node(2) root.right = Node(3) rot. left.left = Node(4) root.left.right = Node(5) print('Nivårekkefølgegjennomgang av binært tre er -') printLevelOrder(root) # Denne koden er bidratt av 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>rheight) { return (lheight + 1);  } else { return (høyre + 1);  } } } // Skriv ut noder på gjeldende nivå public virtual void printCurrentLevel(Noderot, int nivå) { if (root == null) { return;  } if (nivå == 1) { Console.Write(root.data + ' ');  } else if (nivå> 1) { printCurrentLevel(root.left, level - 1);  printCurrentLevel(root.right, nivå - 1);  } } // Driver Code public static void Main(string[] args) { GFG tree = new GFG();  tree.root = ny node(1);  tree.root.left = ny node(2);  tree.root.right = ny node(3);  tree.root.left.left = ny node(4);  tree.root.left.right = ny node(5);  Console.WriteLine('Traversal av nivårekkefølge ' + 'av binært tre er ');  tree.printLevelOrder();  } } // Denne koden er bidratt av 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>rheight) return (lheight + 1);  annet retur (høyre + 1);  } } // Skriv ut noder på gjeldende nivå funksjon printCurrentLevel(root , level) { if (root == null) return;  if (nivå == 1) console.log(root.data + ' ');  else if (nivå> 1) { printCurrentLevel(root.left, level - 1);  printCurrentLevel(root.right, nivå - 1);  } } // Driverprogram for å teste funksjonene ovenfor root = new Node(1);  root.left = ny node(2);  root.right = ny node(3);  root.left.left = ny node(4);  root.left.right = ny node(5);  console.log('Nivårekkefølgegjennomgang av binært tre er ');  printLevelOrder(); // Denne koden er bidratt av umadevi9616>

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

Tidskompleksitet: O(N), hvor N er antall noder i det skjeve treet.
Hjelpeplass: O(1) Hvis rekursjonsstabelen betraktes, er plassen som brukes O(N).

mini verktøylinje excel

Nivåordregjennomgang ved hjelp av

Vi må besøke nodene på et lavere nivå før en hvilken som helst node på et høyere nivå, denne ideen er ganske lik den for en kø. Skyv nodene til et lavere nivå i køen. Når en node er besøkt, skyver den noden fra køen og skyver barnet til den noden i køen.

Dette sikrer at noden på et lavere nivå besøkes før en hvilken som helst node på et høyere nivå.

Nedenfor er implementeringen av tilnærmingen ovenfor:

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;  // Enqueue Root og initialiser høyde q.push(root);  while (q.empty() == false) { // Skriv ut forsiden av køen og fjern den fra køen Node* node = q.front();  cout<< node->data<< ' ';  q.pop();  // Enqueue left child  if (node->venstre != NULL) q.push(node->venstre);  // Enqueue right child if (node->right != NULL) q.push(node->right);  } } // Verktøyfunksjon for å lage en ny trenode Node* newNode(int data) { Node* temp = new Node;  temp->data = data;  temp->venstre = temp->høyre = NULL;  retur temp; } // Driverprogram for å teste funksjonene ovenfor int main() { // La oss lage binært tre vist i diagrammet ovenfor Node* root = newNode(1);  root->venstre = nyNode(2);  root->right = newNode(3);  root->venstre->venstre = nyNode(4);  root->venstre->høyre = nyNode(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->data);  // Enqueue left child if (temp_node->venstre) enQueue(queue, &rear, temp_node->venstre);  // Enqueue right child if (temp_node->right) enQueue(queue, &rear, temp_node->right);  // Dequeue node og gjør den temp_node temp_node = deQueue(queue, &front);  } } // Verktøyfunksjoner struct node** createQueue(int* foran, int* bak) { struct node** queue = (struct node**)malloc( sizeof(struct node*) * MAX_Q_SIZE);  *front = *bak = 0;  returkø; } void enQueue(struct node** queue, int* rear, struct node* new_node) { queue[*rear] = new_node;  (*bak)++; } struct node* deQueue(struct node** kø, int* foran) { (*front)++;  returkø[*front - 1]; } // Hjelpefunksjon som tildeler en ny node med // gitte data og NULL venstre og høyre pekere. struct node* newNode(int data) { struct node* node = (struct node*)malloc(sizeof(struct node));  node->data = data;  node->venstre = NULL;  node->høyre = NULL;  retur (node); } // Driverprogram for å teste funksjonene ovenfor int main() { struct node* root = newNode(1);  root->venstre = nyNode(2);  root->right = newNode(3);  root->venstre->venstre = nyNode(4);  root->venstre->høyre = nyNode(5);  printf('Nivårekkefølge-gjennomgang av binært tre er 
');  printLevelOrder(root);  returner 0; }>
Java
// 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()  {  Queuekø = ny LinkedList();  queue.add(root);  mens (!queue.isEmpty()) { // poll() fjerner det nåværende hodet.   Node tempNode = queue.poll();  System.out.print(tempNode.data + ' ');  // Enqueue left child if (tempNode.left != null) { queue.add(tempNode.left);  } // Enqueue right child if (tempNode.right != null) { queue.add(tempNode.right);  } } } public static void main(String args[]) { // Opprette et binært tre og legge inn // nodene BinaryTree tree_level = new BinaryTree();  tree_level.root = ny node(1);  tree_level.root.left = ny node(2);  tree_level.root.right = ny node(3);  tree_level.root.left.left = ny node(4);  tree_level.root.left.right = ny node(5);  System.out.println('Nivårekkefølgegjennomgang av binært tre er - ');  tree_level.printLevelOrder();  } }>
Python
# 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): # Skriv ut foran køen og # fjern den fra køen print(queue[0].data, end=' ') node = queue.pop(0) # Enqueue left child hvis node.left ikke er Ingen: queue.append(node.left) # Sett i kø til høyre underordnet hvis node.right ikke er Ingen: queue.append(node.right) # Driver Program for å teste funksjonen ovenfor hvis __name__ == '__main__': root = Node(1) ) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) print('Nivårekkefølge Traversering av binært tre er - ') printLevelOrder(root) # Denne koden er bidratt med 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()  {  Queuekø = ny kø();  kø.Kø(root);  while (queue.Count != 0) { Node tempNode = queue.Dequeue();  Console.Write(tempNode.data + ' ');  // Enqueue left child if (tempNode.left != null) { queue.Enqueue(tempNode.left);  } // Enqueue right child if (tempNode.right != null) { queue.Enqueue(tempNode.right);  } } } // Driverkode offentlig statisk void Main() { // Opprette et binært tre og legge inn // nodene BinaryTree tree_level = new BinaryTree();  tree_level.root = ny node(1);  tree_level.root.left = ny node(2);  tree_level.root.right = ny node(3);  tree_level.root.left.left = ny node(4);  tree_level.root.left.right = ny node(5);  Console.WriteLine('Traversal av nivårekkefølge ' + 'av binært tre er - ');  tree_level.printLevelOrder();  } } // Denne koden er bidratt av 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);>

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

Tidskompleksitet: O(N) hvor N er antall noder i det binære treet.
Hjelpeplass: O(N) hvor N er antall noder i det binære treet.