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
Algoritme voor postorder-doorgang van binaire boom:
Het algoritme voor postorder-traversal wordt als volgt weergegeven:
Postwissel (root):
- Volg stap 2 tot en met 4 tot root != NULL
- Postorder (root -> links)
- Postorder (root -> rechts)
- Schrijf root -> gegevens
- Einde lus
Hoe werkt postorder-traversal van binaire boom?
Beschouw de volgende 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
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
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
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
Stap 5: Alle subbomen van knooppunt 3 worden doorlopen. Dus nu wordt knooppunt 3 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 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
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