我們有一個二叉樹以特殊的方式遍歷樹
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中,一種常用的方法是從列表切換到將列表添加到其輸入的函數,以便您可以有效地在兩端使用連接(=函數合成)。 –