logo

Попередній обхід бінарного дерева

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

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

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

Алгоритм попереднього обходу бінарного дерева

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



Попереднє замовлення (корінь):

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

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

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

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

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

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

Крок 1: Спочатку буде відвідано корінь, тобто вузол 1.

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

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

Крок 2: Після цього перейдіть у ліве піддерево. Тепер відвідується корінь лівого піддерева, тобто відвідується вузол 2.

встановити факел
Відвідується вузол 2

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

крок 3: Знову проходить ліве піддерево вузла 2 і відвідується корінь цього піддерева, тобто відвідується вузол 4.

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

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

крок 4: Немає піддерева 4, і відвідується ліве піддерево вузла 2. Таким чином, тепер буде пройдено праве піддерево вузла 2 і буде відвідано корінь цього піддерева, тобто вузол 5.

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

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

крок 5: Відвідується ліве піддерево вузла 1. Таким чином, тепер буде пройдено праве піддерево вузла 1 і відвідано кореневий вузол, тобто вузол 3.

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

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

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

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

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

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

Програма для здійснення попереднього обходу бінарного дерева

Нижче наведено реалізацію коду обходу попереднього замовлення:

C++
// C++ program for preorder 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 preorder traversal void printPreorder(struct Node* node) {  if (node == NULL)  return;  // Deal with the node  cout << node->даних<< ' ';  // Recur on left subtree  printPreorder(node->ліворуч);  // Повторюється в правому піддереві printPreorder(node->right); } // Код драйвера int main() { struct Node* root = new Node(1);  root->left = новий вузол (2);  root->right = новий вузол (3);  root->left->left = новий вузол(4);  root->left->right = новий вузол(5);  root->right->right = новий вузол (6);  // Виклик функції cout<< 'Preorder traversal of binary tree is: 
';  printPreorder(root);  return 0; }>
Java
// Java program for preorder traversals class Node {  int data;  Node left, right;  public Node(int item) {  data = item;  left = right = null;  } } class BinaryTree {  Node root;  BinaryTree() {  root = null;  }  // Function to print preorder traversal  void printPreorder(Node node) {  if (node == null)  return;  // Deal with the node  System.out.print(node.data + ' ');  // Recur on left subtree  printPreorder(node.left);  // Recur on right subtree  printPreorder(node.right);  }  // Driver code  public static void main(String[] args) {  BinaryTree tree = new BinaryTree();  // Constructing the binary tree  tree.root = new Node(1);  tree.root.left = new Node(2);  tree.root.right = new Node(3);  tree.root.left.left = new Node(4);  tree.root.left.right = new Node(5);  tree.root.right.right = new Node(6);  // Function call  System.out.println('Preorder traversal of binary tree is: ');  tree.printPreorder(tree.root);  } }>
Python3
# Python program for preorder 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 preorder traversal def printPreorder(node): if node is None: return # Deal with the node print(node.data, end=' ') # Recur on left subtree printPreorder(node.left) # Recur on right subtree printPreorder(node.right) # 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('Preorder traversal of binary tree is:') printPreorder(root)>
C#
// C# program for preorder 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;  } } // Class to print preorder traversal public class BinaryTree {  // Function to print preorder traversal  public static void printPreorder(Node node)  {  if (node == null)  return;  // Deal with the node  Console.Write(node.data + ' ');  // Recur on left subtree  printPreorder(node.left);  // Recur on right subtree  printPreorder(node.right);  }  // Driver code  public static void Main()  {  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(  'Preorder traversal of binary tree is: ');  printPreorder(root);  } } // This code is contributed by Susobhan Akhuli>
Javascript
// Structure of a Binary Tree Node class Node {  constructor(v) {  this.data = v;  this.left = null;  this.right = null;  } } // Function to print preorder traversal function printPreorder(node) {  if (node === null) {  return;  }  // Deal with the node  console.log(node.data);  // Recur on left subtree  printPreorder(node.left);  // Recur on right subtree  printPreorder(node.right); } // Driver code function main() {  const 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('Preorder traversal of binary tree is:');  printPreorder(root); } main();>

Вихід
Preorder traversal of binary tree is: 1 2 4 5 3 6>

Пояснення:

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

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

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

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

  • О(1) якщо простір стеку рекурсії не розглядається.
  • інакше, O(h) де h – висота дерева
  • У гіршому випадку ч може бути таким же, як Н (коли дерево перекошене)
  • У кращому випадку ч може бути таким же, як спокійний (коли дерево є повним деревом)

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

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

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

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

10 з 10
  • Типи обходу дерева
  • Ітеративний обхід попереднього замовлення
  • Перевірте, чи може даний масив представляти попередній обхід BST
  • Попереднє замовлення з обходу в порядку та після замовлення
  • Знайти n-й вузол у попередньому обході бінарного дерева
  • Попередній обхід N-арного дерева