如何在OCaml中为列表列表传递二叉树?

如何在OCaml中为列表列表传递二叉树?,ocaml,Ocaml,我需要传递一个二叉树来获取列表列表,但不知道如何继续。有什么建议吗?将树结构或更一般的森林视为列表的通常方式是其路径表示。可以将二叉树表示为从根到叶的所有路径的数据,因此树中的路径数与叶数相同 例如: /\ / \ / \ /\ /\ /\ /\ /\ 可表示为以下列表: 左,左 左,右,左 左,右,右 右,左,左 右,左,右,左 右,左,右,右 对,对 这种表示法有许多变体。例如,当节点携带信息时,更容易将图形表示

我需要传递一个二叉树来获取列表列表,但不知道如何继续。有什么建议吗?

将树结构或更一般的森林视为列表的通常方式是其路径表示。可以将二叉树表示为从根到叶的所有路径的数据,因此树中的路径数与叶数相同

例如:

      /\
     /  \
    /    \
   /\    /\
    /\  /\
         /\
可表示为以下列表:

左,左 左,右,左 左,右,右 右,左,左 右,左,右,左 右,左,右,右 对,对 这种表示法有许多变体。例如,当节点携带信息时,更容易将图形表示为每个节点的路径列表,而不仅仅是叶子的路径列表。因此,您可能需要调整此答案以解决您的特定问题

这可以通过以深度优先的方式遍历树来建立。相反,您可以从路径列表递归地重建树

type binary_tree =
  | Empty
  | Node of binary_tree * binary_tree

type branch =
  | Left
  | Right

let rec to_paths tree =
  match tree with
  | Empty -> [[]]
  | Node (left, right) ->
      (List.map (fun l -> Left :: l) (to_paths left))
    @ (List.map (fun l -> Right :: l) (to_paths right))

let rec of_paths = function
  | [[]] -> Empty
  | l ->
    let lefts, rights = List.partition (function
       | [] -> failwith "of_paths: not at binary tree"
       | Left :: _ -> true
       | Right :: _ -> false) l
    in
    Node (of_paths (List.map List.tl lefts),
          of_paths (List.map List.tl rights))

(* A little test : *)    
let tree =
  Node (Node(Empty, Node (Empty, Empty)),
        Node (Node(Empty, Node (Empty, Empty)), Empty))

let () = assert (tree = of_paths (to_paths tree))

你问什么一点也不清楚。你需要提供更多的细节。但在寻求帮助之前,你也应该试着自己编写代码,特别是如果这是一项学校作业,听起来就像这样。