Postorder Traversal van binaire boom

Postorder Traversal van binaire boom

Het passeren van postwissels wordt gedefinieerd als een soort boom doorkruisen die het Links-Rechts-Root-beleid volgt, zodat voor elk knooppunt:

  • De linker deelboom wordt als eerste doorlopen
  • Vervolgens wordt de rechter deelboom doorlopen
  • Ten slotte wordt het hoofdknooppunt van de subboom doorlopen
Het passeren van postwissels

Het passeren van postwissels

Algoritme voor postorder-doorgang van binaire boom:

Het algoritme voor postorder-traversal wordt als volgt weergegeven:

Postwissel (root):

  1. Volg stap 2 tot en met 4 tot root != NULL
  2. Postorder (root -> links)
  3. Postorder (root -> rechts)
  4. Schrijf root -> gegevens
  5. Einde lus

Hoe werkt postorder-traversal van binaire boom?

Beschouw de volgende boom:

Voorbeeld van binaire boom

Voorbeeld van binaire boom

Als we een postorder-traversal uitvoeren in deze binaire boom, zal de traversal als volgt zijn:

Stap 1: De verplaatsing gaat van 1 naar de linker subboom, d.w.z. 2, en vervolgens van 2 naar de linker subboomwortel, d.w.z. 4. Nu heeft 4 geen subboom, dus deze zal worden bezocht.

Knooppunt 4 wordt bezocht

Knooppunt 4 wordt bezocht

Stap 2: Omdat de linker subboom van 2 volledig is bezocht, zal deze nu de rechter subboom van 2 doorkruisen, d.w.z. hij zal naar 5 gaan. Omdat er geen subboom van 5 is, zal deze worden bezocht.

Knooppunt 5 wordt bezocht

Knooppunt 5 wordt bezocht

Stap 3: Nu worden zowel de linker als de rechter deelboom van knooppunt 2 bezocht. Bezoek dus nu knooppunt 2 zelf.

Knooppunt 2 wordt bezocht

Knooppunt 2 wordt bezocht

Stap 4: Wanneer de linker subboom van knooppunt 1 wordt doorlopen, zal deze nu naar de rechter subboomwortel gaan, d.w.z. 3. Knooppunt 3 heeft geen linker subboom, dus zal het de rechter subboom doorkruisen, d.w.z. 6. Knooppunt 6 heeft geen subboom en dus het wordt bezocht.

Knooppunt 6 wordt bezocht

Knooppunt 6 wordt bezocht

Stap 5: Alle subbomen van knooppunt 3 worden doorlopen. Dus nu wordt knooppunt 3 bezocht.

Knooppunt 3 wordt bezocht

Knooppunt 3 wordt bezocht

Stap 6: Omdat alle subbomen van knooppunt 1 zijn doorlopen, is het nu tijd om knooppunt 1 te bezoeken. Daarna eindigt het traject, omdat de hele boom is doorlopen.

De volledige boom wordt bezocht

De volledige boom wordt bezocht

De volgorde van het doorlopen van knooppunten is dus 4 -> 5 -> 2 -> 6 -> 3 -> 1 .

Programma om Postorder Traversal of Binary Tree te implementeren

Hieronder vindt u de code-implementatie van de postorder-traversal:

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->links);> > // Then recur on right subtree> > printPostorder(node->rechts);> > // Now deal with the node> > cout ' '; } // Driver code int main() { struct Node* root = new Node(1); root->links = nieuw knooppunt(2); root->right = nieuw knooppunt(3); root->left->left = nieuw knooppunt(4); root->links->rechts = nieuw knooppunt(5); root->right->right = nieuw knooppunt(6); // Functieoproep 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>

Python3




# 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();>

Uitvoer

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

Uitleg:

Hoe postorderverkeer werkt

Hoe postorderverkeer werkt

Complexiteitsanalyse:

Tijdcomplexiteit: O(N) waarbij N het totale aantal knooppunten is. Omdat het alle knooppunten minstens één keer doorkruist.
Hulpruimte: O(1) als er geen rekening wordt gehouden met recursiestapelruimte. Anders is O(h) waarbij h de hoogte van de boom is

  • In het slechtste geval, H kan hetzelfde zijn als N (als de boom een ​​scheve boom is)
  • In het beste geval, H kan hetzelfde zijn als kalm (als de boom een ​​complete boom is)

Gebruiksscenario's van Postorder Traversal:

Enkele gebruiksscenario's van postorder-traversal zijn:

  • Dit wordt gebruikt voor het verwijderen van bomen.
  • Het is ook handig om de postfix-expressie uit een expressieboom te halen.

Gerelateerde artikelen:

  • Soorten boomtraversals
  • Iteratieve postorder-traversal (met behulp van twee stapels)
  • Iteratieve postorder-traversal (met behulp van één stapel)
  • Postorder van binaire boom zonder recursie en zonder stapel
  • Zoek Postorder-traversal van BST uit pre-order-traversal
  • Morris-traversal voor postorder
  • Afdrukken van postorder-traversal vanuit pre-order en in-order-traversal