У нас есть бинарное деревообходе дерева специальным образом
type 'a tree = Node of 'a * 'a tree * 'a tree | Null ;;
Мы хотим вернуть 'a list
, содержащий все вершины в определенном порядке, то есть расстояние между двумя соседними вершинами в списке не может превышать 3 Каждая вершина может появляться только один раз.
Пример. Для дерева
1
/\
2 6
/
3
/\
4 5
один возможный ответ [1; 3; 4; 5; 2; 6]
На данный момент у меня есть следующий код:
let walk t =
let rec pom_walk t acc end_root = (* it's symmetric, so it could be start_root and the result would be correct too *)
match t with
| Null -> acc
| Node (nr, l, r) ->
if end_root then
nr::(pom_walk r (pom_walk l acc false) false)
else
(pom_walk r (pom_walk l acc true) true) @ [nr]
in
pom_walk t [] true
но этот код имеет квадратное сложность в связи с использованием оператора @
, который является линейным.
Как я могу решить это в линейном времени?
ваш «возможный ответ» неверно, 6 - 2 = 4. –
@willywonka_dailyblah На графике расстояние 2. – btilly
Не знакомы с OCaml, но я угадать '@' список append? В Haskell одним из общих подходов является переход от списков к функциям, которые добавляют список к их входу, так что вы можете эффективно использовать конкатенацию (= функцию). –