Menu
CoddyTech

Construct Binary Tree from Preorder and Inorder Traversal

Даны два массива — preorder и inorder, в которых перечислены различные значения узлов одного и того же бинарного дерева. При прямом обходе сначала посещают узел, затем его левое поддерево, а затем правое. При симметричном обходе сначала посещают левое поддерево, затем узел, а затем правое.

Восстановите дерево и верните его в виде массива в порядке обхода по уровням: корень находится по индексу 0, потомки элемента с индексом i — по индексам 2i+1 (левый) и 2i+2 (правый), а для каждой пустой позиции укажите -1. Массив заканчивается на последнем узле, без завершающих значений -1.

Функция

buildTree(preorder: integer-array, inorder: integer-array) → integer-array
preorderinteger-array
значения в порядке прямого обхода: узел, левое поддерево, правое поддерево
inorderinteger-array
значения в порядке inorder: левое поддерево, узел, правое поддерево
Возвращаетinteger-array
дерево в порядке обхода по уровням, где -1 обозначает пустые позиции, без завершающего -1

Ограничения

  • 1 ≤ preorder.length ≤ 3000
  • inorder.length == preorder.length
  • 0 ≤ preorder[i] ≤ 104, и все значения различны.
  • inorder содержит те же значения, и оба массива описывают одно и то же бинарное дерево.
  • Глубина дерева не превышает 14, поэтому каждый индекс в ответе меньше 214-1 = 16383.

Примеры

Ввод
preorder = [7, 3, 0, 9, 4, 6]inorder = [0, 3, 9, 7, 4, 6]
Вывод
[7, 3, 4, 0, 9, -1, 6]
Пояснение
Прямой обход начинается с корня, 7. Он находится на позиции 3 в inorder, поэтому 0, 3, 9 идут влево, а 4, 6 — вправо. У 4 есть только правый потомок — 6, поэтому индекс 5 остаётся равным -1.
challenge icon

Дополнительный вопрос

Сможешь ли ты восстановить дерево без рекурсии, за один проход по preorder с явным стеком?

Сбросить код
def buildTree(preorder, inorder):
    # Напишите код здесь

Тест #1

Тест #2

Аргументы

preorder = [7, 3, 0, 9, 4, 6]
inorder = [0, 3, 9, 7, 4, 6]

Ожидаемый вывод

[7, 3, 4, 0, 9, -1, 6]