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
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):
- Seguiu els passos 2 a 4 fins que root != NULL
- Postordre (arrel -> esquerra)
- Postordre (arrel -> dreta)
- Escriu arrel -> dades
- Bucle final
Com funciona la travessa postordre de l'arbre binari?
Considereu l'arbre següent:
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
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
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
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
Pas 5: Es recorren tots els subarbres del node 3. Així que ara 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'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
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