我们有一个二叉树以特殊的方式遍历树
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的,但我猜测'@'是list append?在Haskell中,一种常用的方法是从列表切换到将列表添加到其输入的函数,以便您可以有效地在两端使用连接(=函数合成)。 –