幅・深さ優先fold
思いつきで書いているので、全く当てになりません。あしからず。
type 'a t = { dat : 'a; children : 'a t list; } let bff f x t = let q = Queue.create () in Queue.add t q; let rec loop r = try let t = Queue.pop q in List.iter (fun c -> Queue.push c q) t.children; loop (f r t.dat) with Queue.Empty -> r in loop x let rec dff f x t = List.fold_left (fun r c -> dff f r c) (f x t.dat) t.children