这是一个递归算法。这是伪代码(未经测试的ocaml代码):
type result = {n1 : node; n2 : node; d1 : int (* depth of node n1 *); d2 : int; distance: int}
(* a struct containing:
- the couple of nodes (n1,n2),
- the depth of the nodes, with depth(n1) >= depth(n2)
- the distance between n1 & n2 *)
let find_max (n : node) : result =
let max (s1 : result) (s2 : result) = if s1.distance < s2.distance then s2 else s1 in
let cl : node list = Node.children n in
if cl = []
then { n1 = n; n2 = n; d1 = 0; d2 = 0; distance = 0 }
else
let ml = List.map find_max cl in
let nl = List.map (fun e -> e.n1, e.d1+1) ml in
let (k1,d1)::(k2,d2)::nl = nl in
let k1,d1,k2,d2 = if d1 > d2 then k1,d1,k2,d2 else k2,d2,k1,d1 in
let s = {n1 = k1;n2 = k2; d1 = d1; d2 = d2; distance = d1+d2} in
let m1 = List.fold_left (fun r (e,d) ->
if r.d1< d
then { r with n1 = e; d1 = d; distance = d+d2 }
else if r.d2 < d
then { r with n2 = e; d2 = d; distance = d+d1 }
else r) s nl in
max m1 (List.fold_left max (List.hd ml) (List.tl ml))
该m1
值是通过保留 nl 列表的两个最深节点来构建的,其中距离是它们的深度之和。
List.map
是将给定函数应用于列表的所有元素并返回结果列表的函数。
List.fold_left
是一个函数,将给定函数递归地应用于累加器和列表的元素,每次都使用前一个应用程序的结果作为新的累加器值。结果是最后一个累加器值。
List.hd
返回列表的第一个元素。
List.tl
返回没有第一个元素的列表。