logo

Iš anksto užsisakykite „Binary Tree“ perėjimą

Išankstinis pervažiavimas apibrėžiamas kaip tipas medžio perėjimas kuri atitinka šaknų-kairės-dešinės politikos, kur:

tcp ip modelis
  • Pirmiausia aplankomas pomedžio šakninis mazgas.
  • Tada perkeliamas kairysis pomedis.
  • Pagaliau pervažiuojamas dešinysis pomedis.
Išankstinis pervažiavimas

Išankstinis pervažiavimas

Dvejetainio medžio išankstinio užsakymo judėjimo algoritmas

Išankstinio užsakymo judėjimo algoritmas parodytas taip:



Išankstinis užsakymas (root):

  1. Atlikite 2–4 veiksmus, kol šaknis != NULL
  2. Rašyti root -> data
  3. Išankstinis užsakymas (root -> left)
  4. Išankstinis užsakymas (root -> dešinėn)
  5. Pabaigos kilpa

Kaip veikia dvejetainio medžio išankstinis užsakymas?

Apsvarstykite šį medį:

Dvejetainio medžio pavyzdys

Dvejetainio medžio pavyzdys

Jei šiame dvejetainiame medyje atliksime išankstinio užsakymo perėjimą, tada perėjimas bus toks:

1 žingsnis: Iš pradžių bus aplankyta šaknis, t. y. 1 mazgas.

Aplankytas 1 mazgas

Aplankytas 1 mazgas

2 žingsnis: Po to pereikite kairiuoju pomedžiu. Dabar aplankoma kairiojo pomedžio šaknis, t. y. aplankomas 2 mazgas.

Aplankytas 2 mazgas

Aplankytas 2 mazgas

java nuorodų sąrašas

3 veiksmas: Vėl kertamas kairysis 2 mazgo pomedis ir aplankoma to pomedžio šaknis, ty 4 mazgas.

Aplankytas 4 mazgas

Aplankytas 4 mazgas

4 veiksmas: Nėra 4 pomedžio, o lankomas kairysis mazgo 2 pomedis. Taigi dabar bus perkeltas dešinysis 2 mazgo pomedis ir bus aplankyta to pomedžio šaknis, ty 5 mazgas.

Aplankytas 5 mazgas

Aplankytas 5 mazgas

5 veiksmas: Lankomas kairysis 1 mazgo pomedis. Taigi dabar bus perkeltas dešinysis 1 mazgo pomedis ir aplankytas šakninis mazgas, ty mazgas 3.

eilutė java
Aplankytas 3 mazgas

Aplankytas 3 mazgas

6 veiksmas: 3 mazgas neturi kairiojo pomedžio. Taigi bus perkeltas dešinysis pomedis ir aplankyta pomedžio šaknis, ty 6 mazgas. Po to nėra mazgo, kuris dar nebūtų pereitas. Taigi kelionė baigiasi.

Aplankytas visas medis

Aplankytas visas medis

Taigi mazgų perėjimo tvarka yra 1 -> 2 -> 4 -> 5 -> 3 -> 6 .

hashset vs hashmap

Programa, skirta įgyvendinti dvejetainio medžio išankstinį užsakymą

Toliau pateikiamas išankstinio užsakymo kodo įgyvendinimas:

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->duomenis<< ' ';  // Recur on left subtree  printPreorder(node->kairėje);  // Pasikartoti dešiniajame pomedyje printPreorder(mazgas->dešinė); } // Tvarkyklės kodas int main() { struct Node* root = new Node(1);  root->left = naujas mazgas (2);  root->right = naujas mazgas (3);  šaknis->kairė->kairė = naujas mazgas(4);  šaknis->kairė->dešinė = naujas mazgas(5);  root->right->right = naujas mazgas (6);  // Funkcijos iškvietimas<< '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();>

Išvestis
Preorder traversal of binary tree is: 1 2 4 5 3 6>

Paaiškinimas:

Kaip veikia išankstinio užsakymo perkėlimas

Kaip veikia išankstinio užsakymo perkėlimas

Sudėtingumo analizė:

Laiko sudėtingumas: O(N) čia N yra bendras mazgų skaičius. Nes jis bent kartą kerta visus mazgus.
Pagalbinė erdvė:

  • O(1) jei neatsižvelgiama į rekursijos kamino erdvę.
  • Priešingu atveju, Oi) kur h yra medžio aukštis
  • Blogiausiu atveju, h gali būti toks pat kaip N (kai medis yra pasviręs)
  • Geriausiu atveju, h gali būti toks pat kaip Ramus (kai medis yra pilnas medis)

Išankstinio užsakymo naudojimo atvejai:

Kai kurie išankstinio užsakymo naudojimo atvejai yra šie:

  • Tai dažnai naudojama kuriant medžio kopiją.
  • Taip pat naudinga gauti priešdėlio išraišką iš išraiškų medžio.

Susiję straipsniai:

  • Medžių kirtimo tipai
  • Iteratyvus išankstinis užsakymas
  • Patikrinkite, ar nurodytas masyvas gali reikšti išankstinį BST perėjimą
  • Išankstinis užsakymas iš inorder ir postorder traversals
  • Suraskite n-ąjį mazgą dvejetainio medžio išankstiniame užsakyme
  • Išankstinis užsakymas pervažiuoti N-aries medį