Travessament posterior de l'arbre binari

Travessament posterior de l'arbre binari

Travessa postal es defineix com un tipus de travessa d'arbres que segueix la política Left-Right-Root de manera que per a cada node:

  • Primer es recorre el subarbre esquerre
  • Aleshores es recorre el subarbre dret
  • Finalment, es recorre el node arrel del subarbre
Travessa postal

Travessa postal

Algorisme per a la travessa de l'ordre posterior de l'arbre binari:

L'algorisme per a la travessa posterior a la comanda es mostra de la següent manera:

Mandat postal (arrel):

  1. Seguiu els passos 2 a 4 fins que root != NULL
  2. Postordre (arrel -> esquerra)
  3. Postordre (arrel -> dreta)
  4. Escriu arrel -> dades
  5. Bucle final

Com funciona la travessa postordre de l'arbre binari?

Considereu l'arbre següent:

Exemple d

Exemple d'arbre binari

Si realitzem un recorregut posterior a l'ordre en aquest arbre binari, el recorregut serà el següent:

Pas 1: La travessa anirà de l'1 al seu subarbre esquerre, és a dir, 2, després de 2 a la seva arrel del subarbre esquerre, és a dir, 4. Ara 4 no té subarbre, així que serà visitat.

Es visita el node 4

Es visita el node 4

Pas 2: Com que el subarbre esquerre de 2 es visita completament, ara travessarà el subarbre dret de 2, és a dir, es mourà a 5. Com que no hi ha subarbre de 5, es visitarà.

Es visita el node 5

Es visita el node 5

Pas 3: Ara es visiten els subarbres esquerre i dret del node 2. Així que ara visiteu el mateix node 2.

Es visita el node 2

Es visita el node 2

Pas 4: A mesura que es travessa el subarbre esquerre del node 1, ara es mourà a l'arrel del subarbre dret, és a dir, 3. El node 3 no té cap subarbre esquerre, de manera que travessarà el subarbre dret, és a dir, 6. El node 6 no té cap subarbre i doncs es visita.

Es visita el node 6

Es visita el node 6

Pas 5: Es recorren tots els subarbres del node 3. Així que ara es visita el node 3.

Es visita el node 3

Es visita el node 3

Pas 6: Com que es recorren tots els subarbres del node 1, ara és el moment de visitar el node 1 i la travessa s'acaba després d'això mentre es recorre tot l'arbre.

Es visita l

Es visita l'arbre complet

Per tant, l'ordre de recorregut dels nodes és 4 -> 5 -> 2 -> 6 -> 3 -> 1 .

Programa per implementar Postorder Traversal of Binary Tree

A continuació es mostra la implementació de codi de la travessa postordre:

C++




// C++ program for postorder 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 postorder traversal> void> printPostorder(> struct> Node* node)> {> > if> (node == NULL)> > return> ;> > // First recur on left subtree> > printPostorder(node->esquerra);> > // Then recur on right subtree> > printPostorder(node->dreta);> > // Now deal with the node> > cout ' '; } // Driver code int main() { struct Node* root = new Node(1); root->esquerra = nou Node (2); arrel->dreta = nou Node (3); arrel->esquerra->esquerra = nou Node (4); arrel->esquerra->dreta = nou Node (5); arrel->dreta->dreta = nou Node (6); // Crida de funció cout < < 'Postorder traversal of binary tree is: '; printPostorder(root); return 0; }>

Java




// Java program for postorder traversals> import> java.util.*;> // Structure of a Binary Tree Node> class> Node {> > int> data;> > Node left, right;> > Node(> int> v)> > {> > data = v;> > left = right => null> ;> > }> }> class> GFG {> > > // Function to print postorder traversal> > static> void> printPostorder(Node node)> > {> > if> (node ==> null> )> > return> ;> > // First recur on left subtree> > printPostorder(node.left);> > // Then recur on right subtree> > printPostorder(node.right);> > // Now deal with the node> > System.out.print(node.data +> ' '> );> > }> > // Driver code> > public> static> void> main(String[] args)> > {> > 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> > System.out.println(> 'Postorder traversal of binary tree is: '> );> > printPostorder(root);> > }> }> // This code is contributed by prasad264>

Python 3




# Python program for postorder 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 postorder traversal> def> printPostorder(node):> > if> node> => => None> :> > return> > # First recur on left subtree> > printPostorder(node.left)> > # Then recur on right subtree> > printPostorder(node.right)> > # Now deal with the node> > print> (node.data, end> => ' '> )> # 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> (> 'Postorder traversal of binary tree is:'> )> > printPostorder(root)>

C#




// C# program for postorder 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> ;> > }> }> public> class> GFG {> > // Function to print postorder traversal> > static> void> printPostorder(Node node)> > {> > if> (node ==> null> )> > return> ;> > // First recur on left subtree> > printPostorder(node.left);> > // Then recur on right subtree> > printPostorder(node.right);> > // Now deal with the node> > Console.Write(node.data +> ' '> );> > }> > static> public> void> Main()> > {> > // Code> > 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(> > 'Postorder traversal of binary tree is: '> );> > printPostorder(root);> > }> }> // This code is contributed by karthik.>

Javascript




// Structure of a Binary Tree Node> class Node {> > constructor(v) {> > this> .data = v;> > this> .left => null> ;> > this> .right => null> ;> > }> }> // Function to print postorder traversal> function> printPostorder(node) {> > if> (node ==> null> ) {> > return> ;> > }> > // First recur on left subtree> > printPostorder(node.left);> > // Then recur on right subtree> > printPostorder(node.right);> > // Now deal with the node> > console.log(node.data +> ' '> );> }> // Driver code> function> main() {> > let 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(> 'Postorder traversal of binary tree is: '> );> > printPostorder(root);> }> main();>

Sortida

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

Explicació:

Com funciona el recorregut de comandes per correu

Com funciona el recorregut de comandes per correu

Anàlisi de complexitat:

Complexitat temporal: O(N) on N és el nombre total de nodes. Perquè travessa tots els nodes almenys una vegada.
Espai auxiliar: O(1) si no es considera cap espai de pila de recursivitat. En cas contrari, O(h) on h és l'alçada de l'arbre

  • En el pitjor dels casos, h pot ser el mateix que N (quan l'arbre és un arbre esbiaixat)
  • En el millor dels casos, h pot ser el mateix que calma (quan l'arbre és un arbre complet)

Casos d'ús de Postorder Traversal:

Alguns casos d'ús de la travessa posterior a la comanda són:

  • S'utilitza per a la supressió d'arbres.
  • També és útil obtenir l'expressió postfix d'un arbre d'expressions.

Articles relacionats:

  • Tipus de travessa d'arbres
  • Recorregut iteratiu de la comanda posterior (utilitzant dues piles)
  • Recorregut iteratiu de la comanda posterior (utilitzant una pila)
  • Postordre de l'arbre binari sense recursivitat i sense pila
  • Trobeu el recorregut posterior a la comanda de BST des del recorregut de la comanda prèvia
  • Travessia de Morris per a la comanda per correu
  • Imprimeix el recorregut posterior a la comanda des de la prevenda i el recorregut sense ordre