Code Review

Compare your solutions

    #| Для этого упражнения нет проверок.
Любое решение будет считаться успешным ответом. |#
а. Описание работы partial-tree
Процедура partial-tree строит сбалансированное бинарное дерево из первых n элементов списка elts, причем:

Сначала она рекурсивно строит левое поддерево из left-size = (n - 1) / 2 элементов.

Затем берет следующий элемент (сразу после левого поддерева) в качестве корня.

Оставшиеся right-size = n - left-size - 1 элементов используются для построения правого поддерева.

Результатом является пара: cons из:

построенного дерева

оставшегося списка (элементы, не попавшие в дерево)

Пример: (list->tree '(1 3 5 7 9 11))
Список имеет 6 элементов ⇒ n = 6

partial-tree будет работать следующим образом:

left-size = (6 - 1) / 2 = 2
→ Построим левое поддерево из (1 3)

Для (1 3):

left-size = (2 - 1) / 2 = 0

→ левое поддерево — пустое

Корень: 1

→ правое поддерево из одного элемента 3

левое и правое поддерево — пустые

→ дерево:

1
 \
  3
Корень основного дерева: следующий элемент — 5

right-size = 6 - 2 - 1 = 3
→ Построим правое поддерево из (7 9 11)

left-size = 1, значит:

левое поддерево: 7

корень: 9

правое поддерево: 11

→ дерево:

  9
 / \
7  11
Итоговое дерево:

       5
     /   \
    1     9
     \   / \
      3 7  11
б. Порядок роста числа шагов
Анализ:
На каждом уровне partial-tree делит список пополам (или почти пополам), строя левое и правое поддеревья рекурсивно. При этом:

Каждый элемент списка посещается ровно один раз, чтобы стать либо:

корнем узла

частью левого/правого поддерева

Количество шагов — пропорционально количеству узлов, т.е. O(n)

Ответ:
Порядок роста — Θ(n), где n — длина входного списка.