【发布时间】:2012-09-21 20:21:11
【问题描述】:
我的任务是编写一个 ‘a btree -> ‘a option list 类型的函数,它将给定的树存储在 ‘a option 类型的元素列表中,按后缀顺序(后序)。
内部节点将由None 表示,值为x 的外部节点(叶子)将由Some x 表示。
到目前为止,叶子的操作很容易,但是如何将其放入'a option list?
type 'a btree = L of 'a | N of 'a btree * 'a btree ;;
let rec store t =
match t with
| L x -> Some x
| N (a,b) -> None ???
;;
我知道的第二个匹配案例不正确,但是如何解决呢?
【问题讨论】:
-
对了,这是作业吗?如果是的话也不是坏事,但这样说也算是礼貌。
-
是的,希望是最后一个 :D。很高兴我对 Ocaml 有一些概念,但老实说,我将来永远不会使用它。
-
您可能会感到惊讶;我在工作中多次使用它,这不是你所说的学术环境。有时它只是适合这项工作的工具。
-
我建议您查看@gasche 的答案;使用累加器会使这个大大更快,并避免列表追加,每个列表的长度为 O(n)。
-
嗯?那将是前序遍历,而不是后序遍历。作为参考,我使用来自the Wikipedia page on tree traversal 的定义。此外,您的更改也无济于事,因为它允许您从一片叶子开始;这只是定义的函数的性质。您可以尝试进一步限制它,不允许您从一片叶子开始,但这会不必要地难看。