Preordine di attraversamento dell'albero binario

Preordine di attraversamento dell'albero binario

Attraversamento del preordine è definito come un tipo di attraversamento degli alberi che segue la politica Root-Left-Right dove:

  • Il nodo radice del sottoalbero viene visitato per primo.
  • Quindi viene attraversato il sottoalbero sinistro.
  • Alla fine viene attraversato il sottoalbero destro.
Attraversamento del preordine

Attraversamento del preordine

Algoritmo per l'attraversamento del preordine dell'albero binario

L'algoritmo per l'attraversamento del preordine è mostrato come segue:

Preordine(radice):

  1. Seguire i passaggi da 2 a 4 fino a root != NULL
  2. Scrivi root -> dati
  3. Preordine (radice -> sinistra)
  4. Preordine (root -> destra)
  5. Fine del ciclo

Come funziona l'attraversamento del preordine dell'albero binario?

Consideriamo il seguente albero:

Esempio di albero binario

Esempio di albero binario

Se eseguiamo un attraversamento del preordine in questo albero binario, l'attraversamento sarà il seguente:

Passo 1: Inizialmente verrà visitata la root, ovvero il nodo 1.

Il nodo 1 viene visitato

Il nodo 1 viene visitato

Passo 2: Successivamente, attraversa il sottoalbero di sinistra. Ora viene visitata la radice del sottoalbero sinistro, ovvero viene visitato il nodo 2.

Viene visitato il nodo 2

Viene visitato il nodo 2

Passaggio 3: Anche in questo caso viene attraversato il sottoalbero sinistro del nodo 2 e viene visitata la radice di quel sottoalbero, ovvero il nodo 4.

Viene visitato il nodo 4

Viene visitato il nodo 4

Passaggio 4: Non esiste un sottoalbero di 4 e viene visitato il sottoalbero sinistro del nodo 2. Quindi ora verrà attraversato il sottoalbero destro del nodo 2 e verrà visitata la radice di quel sottoalbero, ovvero il nodo 5.

Viene visitato il nodo 5

Viene visitato il nodo 5

Passaggio 5: Viene visitato il sottoalbero sinistro del nodo 1. Quindi ora verrà attraversato il sottoalbero destro del nodo 1 e verrà visitato il nodo radice, ovvero il nodo 3.

Viene visitato il nodo 3

Viene visitato il nodo 3

Passaggio 6: Il nodo 3 non ha un sottoalbero sinistro. Quindi verrà attraversato il sottoalbero destro e verrà visitata la radice del sottoalbero, ovvero il nodo 6. Dopodiché non c'è nodo che non sia ancora stato attraversato. Quindi la traversata finisce.

Viene visitato l

Viene visitato l'albero completo

Quindi l'ordine di attraversamento dei nodi è 1 -> 2 -> 4 -> 5 -> 3 -> 6 .

Programma per implementare l'attraversamento del preordine dell'albero binario

Di seguito è riportata l'implementazione del codice dell'attraversamento del preordine:

C++
// C++ program for preorder traversals #include  using namespace std; // Structure of a Binary Tree Node struct Node {  int data;  struct Node *left, *right;  Node(int v)  {  data = v;  left = right = NULL;  } }; // Function to print preorder traversal void printPreorder(struct Node* node) {  if (node == NULL)  return;  // Deal with the node  cout  < < node->dati < < ' ';  // Recur on left subtree  printPreorder(node->Sinistra);  // Ricorre sul sottoalbero destro printPreorder(node->right); } // Codice driver int main() { struct Node* root = new Node(1);  radice->sinistra = nuovo nodo(2);  radice->destra = nuovo nodo(3);  radice->sinistra->sinistra = nuovo nodo(4);  root->sinistra->destra = nuovo nodo(5);  radice->destra->destra = nuovo Nodo(6);  // Chiamata di funzione cout < < 'Preorder traversal of binary tree is: 
';  printPreorder(root);  return 0; } 
Giava
// Java program for preorder traversals class Node {  int data;  Node left, right;  public Node(int item) {  data = item;  left = right = null;  } } class BinaryTree {  Node root;  BinaryTree() {  root = null;  }  // Function to print preorder traversal  void printPreorder(Node node) {  if (node == null)  return;  // Deal with the node  System.out.print(node.data + ' ');  // Recur on left subtree  printPreorder(node.left);  // Recur on right subtree  printPreorder(node.right);  }  // Driver code  public static void main(String[] args) {  BinaryTree tree = new BinaryTree();  // Constructing the binary tree  tree.root = new Node(1);  tree.root.left = new Node(2);  tree.root.right = new Node(3);  tree.root.left.left = new Node(4);  tree.root.left.right = new Node(5);  tree.root.right.right = new Node(6);  // Function call  System.out.println('Preorder traversal of binary tree is: ');  tree.printPreorder(tree.root);  } } 
Python3
# Python program for preorder traversals # Structure of a Binary Tree Node class Node: def __init__(self, v): self.data = v self.left = None self.right = None # Function to print preorder traversal def printPreorder(node): if node is None: return # Deal with the node print(node.data, end=' ') # Recur on left subtree printPreorder(node.left) # Recur on right subtree printPreorder(node.right) # Driver code if __name__ == '__main__': root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) root.right.right = Node(6) # Function call print('Preorder traversal of binary tree is:') printPreorder(root) 
C#
// C# program for preorder traversals using System; // Structure of a Binary Tree Node public class Node {  public int data;  public Node left, right;  public Node(int v)  {  data = v;  left = right = null;  } } // Class to print preorder traversal public class BinaryTree {  // Function to print preorder traversal  public static void printPreorder(Node node)  {  if (node == null)  return;  // Deal with the node  Console.Write(node.data + ' ');  // Recur on left subtree  printPreorder(node.left);  // Recur on right subtree  printPreorder(node.right);  }  // Driver code  public static void Main()  {  Node 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);  root.right.right = new Node(6);  // Function call  Console.WriteLine(  'Preorder traversal of binary tree is: ');  printPreorder(root);  } } // This code is contributed by Susobhan Akhuli 
Javascript
// Structure of a Binary Tree Node class Node {  constructor(v) {  this.data = v;  this.left = null;  this.right = null;  } } // Function to print preorder traversal function printPreorder(node) {  if (node === null) {  return;  }  // Deal with the node  console.log(node.data);  // Recur on left subtree  printPreorder(node.left);  // Recur on right subtree  printPreorder(node.right); } // Driver code function main() {  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);  root.right.right = new Node(6);  // Function call  console.log('Preorder traversal of binary tree is:');  printPreorder(root); } main(); 

Produzione
Preorder traversal of binary tree is: 1 2 4 5 3 6 

Spiegazione:

Come funziona l

Come funziona l'attraversamento del preordine

Analisi della complessità:

Complessità temporale: O(N) dove N è il numero totale di nodi. Perché attraversa tutti i nodi almeno una volta.
Spazio ausiliario:

  • O(1) se non viene considerato lo spazio dello stack di ricorsione.
  • Altrimenti, OH) dove h è l'altezza dell'albero
  • Nel peggiore dei casi, H può essere lo stesso di N (quando l'albero è un albero inclinato)
  • Nel migliore dei casi, H può essere lo stesso di calma (quando l'albero è un albero completo)

Casi d'uso di Preorder Traversal:

Alcuni casi d'uso dell'attraversamento del preordine sono:

  • Questo viene spesso utilizzato per creare una copia di un albero.
  • È anche utile ottenere l'espressione del prefisso da un albero delle espressioni.

Articoli Correlati:

  • Tipi di attraversamento degli alberi
  • Attraversamento iterativo del preordine
  • Controlla se l'array fornito può rappresentare l'attraversamento del preordine di BST
  • Preordine da attraversamenti inordine e postordine
  • Trova l'ennesimo nodo nell'attraversamento in preordine di un albero binario
  • Attraversamento in preordine di un albero N-ario