Postordre gennemkørsel af binært træ

Postordre gennemkørsel af binært træ

Postordregennemgang er defineret som en type trægennemgang som følger venstre-højre-rod-politikken, således at for hver node:

  • Det venstre undertræ krydses først
  • Derefter krydses det højre undertræ
  • Til sidst krydses undertræets rodknude
Postordregennemgang

Postordregennemgang

Algoritme for postorder-gennemgang af binært træ:

Algoritmen for postorder-gennemgang er vist som følger:

Postordre (rod):

  1. Følg trin 2 til 4 indtil root != NULL
  2. Postordre (rod -> venstre)
  3. Postordre (rod -> højre)
  4. Skriv root -> data
  5. Slut sløjfe

Hvordan fungerer Postorder Traversal of Binary Tree?

Overvej følgende træ:

Eksempel på binært træ

Eksempel på binært træ

Hvis vi udfører en postorder traversal i dette binære træ, så vil gennemgangen være som følger:

Trin 1: Gennemgangen vil gå fra 1 til dets venstre undertræ, dvs. 2, derefter fra 2 til dets venstre undertrærod, dvs. 4. Nu har 4 ikke noget undertræ, så det vil blive besøgt.

Node 4 er besøgt

Node 4 er besøgt

Trin 2: Da det venstre undertræ af 2 besøges fuldstændigt, vil det nu krydse det højre undertræ af 2, dvs. det vil flytte til 5. Da der ikke er noget undertræ på 5, vil det blive besøgt.

Node 5 er besøgt

Node 5 er besøgt

Trin 3: Nu er både venstre og højre undertræ af node 2 besøgt. Så besøg nu selve node 2.

Node 2 er besøgt

Node 2 er besøgt

Trin 4: Når det venstre undertræ af node 1 krydses, vil det nu flytte til højre undertrærod, dvs. 3. Node 3 har ikke noget venstre undertræ, så det vil krydse det højre undertræ, dvs. 6. Node 6 har intet undertræ og så den bliver besøgt.

Node 6 er besøgt

Node 6 er besøgt

Trin 5: Alle undertræerne i node 3 gennemløbes. Så nu er node 3 besøgt.

Node 3 er besøgt

Node 3 er besøgt

Trin 6: Da alle undertræerne i node 1 gennemløbes, er det nu tid til, at node 1 skal besøges, og gennemkørslen slutter derefter, da hele træet krydses.

Hele træet er besøgt

Hele træet er besøgt

Så rækkefølgen af ​​krydsning af noder er 4 -> 5 -> 2 -> 6 -> 3 -> 1 .

Program til at implementere Postorder Traversal of Binary Tree

Nedenfor er kodeimplementeringen af ​​postordre-gennemgangen:

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->venstre);> > // Then recur on right subtree> > printPostorder(node->højre);> > // Now deal with the node> > cout ' '; } // Driver code int main() { struct Node* root = new Node(1); root->venstre = ny node(2); root->right = ny node(3); root->venstre->venstre = ny node(4); root->venstre->højre = ny node(5); root->right->right = new Node(6); // Funktionskald 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();>

Produktion

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

Forklaring:

Sådan fungerer postordregennemgang

Sådan fungerer postordregennemgang

Kompleksitetsanalyse:

Tidskompleksitet: O(N) hvor N er det samlede antal knudepunkter. Fordi den krydser alle noderne mindst én gang.
Hjælpeplads: O(1), hvis der ikke tages hensyn til et rekursionsstabelrum. Ellers O(h), hvor h er højden af ​​træet

  • I værste fald, h kan være det samme som N (når træet er et skævt træ)
  • I bedste tilfælde, h kan være det samme som berolige (når træet er et komplet træ)

Brugstilfælde af Postorder Traversal:

Nogle anvendelsestilfælde af postordre-gennemkørsel er:

  • Dette bruges til sletning af træer.
  • Det er også nyttigt at hente postfix-udtrykket fra et udtrykstræ.

Relaterede artikler:

  • Typer af trægennemløb
  • Iterativ postordergennemgang (ved hjælp af to stakke)
  • Iterativ postordre-gennemgang (ved hjælp af én stak)
  • Postordre af binært træ uden rekursion og uden stak
  • Find Postorder-gennemgang af BST fra preorder-gennemgang
  • Morris traversal for postordre
  • Udskriv postordre-gennemgang fra forudbestilt og inorder-gennemgang