logo

Postorder Traversal бінарного дерева

Обхід поштового замовлення визначається як вид обхід дерева який дотримується політики лівого-правого кореня таким чином, що для кожного вузла:

  • Першим проходить ліве піддерево
  • Потім виконується обхід правого піддерева
  • Нарешті, здійснюється обхід кореневого вузла піддерева
Обхід поштового замовлення

Обхід поштового замовлення



Алгоритм постпорядкового обходу бінарного дерева:

Алгоритм обходу після замовлення показаний таким чином:

Поштовий переказ (корінець):

  1. Виконуйте кроки 2-4, доки root не стане != NULL
  2. Postorder (корінь -> ліворуч)
  3. Postorder (корінь -> праворуч)
  4. Записати корінь -> дані
  5. Кінцева петля

Як працює Postorder Traversal бінарного дерева?

Розглянемо таке дерево:



Приклад бінарного дерева

Приклад бінарного дерева

Якщо ми виконуємо обхід після порядку в цьому бінарному дереві, то обхід буде таким:

Крок 1: Обхід проходитиме від 1 до його лівого піддерева, тобто 2, потім від 2 до його лівого кореня піддерева, тобто 4. Тепер 4 не має піддерева, тому його відвідуватимуть.



Вузол 4 відвідується

Вузол 4 відвідується

крок 2: Оскільки ліве піддерево 2 відвідано повністю, тепер воно перетинатиме праве піддерево 2, тобто воно переміститься до 5. Оскільки піддерева 5 немає, його буде відвідано.

Вузол 5 відвідується

Вузол 5 відвідується

крок 3: Тепер відвідуються як ліве, так і праве піддерева вузла 2. Тож тепер відвідайте сам вузол 2.

Відвідується вузол 2

Відвідується вузол 2

крок 4: Під час обходу лівого піддерева вузла 1 він тепер переміститься до кореня правого піддерева, тобто 3. Вузол 3 не має жодного лівого піддерева, тому він обійде праве піддерево, тобто 6. Вузол 6 не має піддерева і тому його відвідують.

Вузол 6 відвідується

Вузол 6 відвідується

arraylist відсортований java

крок 5: Усі піддерева вузла 3 обходяться. Отже, зараз відвідано вузол 3.

Відвідується вузол 3

Відвідується вузол 3

js onclick

Крок 6: Оскільки пройдено всі піддерева вузла 1, тепер настав час для відвідування вузла 1, після чого обхід завершується, оскільки пройдено все дерево.

Відвідується все дерево

Відвідується все дерево

Отже, порядок обходу вузлів такий 4 -> 5 -> 2 -> 6 -> 3 -> 1 .

Програма для впровадження 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->ліворуч);> >// Then recur on right subtree> >printPostorder(node->правильно);> >// Now deal with the node> >cout ' '; } // Driver code int main() { struct Node* root = new Node(1); root->зліва = новий вузол (2); root->right = новий вузол (3); root->left->left = новий вузол(4); root->left->right = новий вузол(5); root->right->right = новий вузол (6); // Виклик функції 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




сортування вибору java

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

>

>

Вихід

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

Пояснення:

Як працює обхід замовлень поштою

Як працює обхід замовлень поштою

Аналіз складності:

Часова складність: O(N), де N - загальна кількість вузлів. Тому що він проходить усі вузли принаймні один раз.
Допоміжний простір: O(1), якщо простір стеку рекурсії не розглядається. В іншому випадку O(h), де h — висота дерева

  • У гіршому випадку ч може бути таким же, як Н (коли дерево перекошене)
  • У кращому випадку ч може бути таким же, як спокійний (коли дерево є повним деревом)

Випадки використання Postorder Traversal:

Нижче наведено деякі випадки використання обходу після замовлення:

  • Це використовується для видалення дерева.
  • Також корисно отримати постфіксний вираз із дерева виразів.

Пов'язані статті:

  • Типи обходу дерев
  • Ітеративний обхід постпорядку (з використанням двох стеків)
  • Ітеративний обхід після замовлення (з використанням одного стека)
  • Постпорядок бінарного дерева без рекурсії та без стека
  • Знайдіть обхід BST після замовлення з обходу попереднього замовлення
  • Обхід Морріса для замовлення поштою
  • Друк обходу після замовлення з попереднього замовлення та обходу в порядку