Ocaml list to tree

浪尽此生 提交于 2019-12-11 05:26:03

问题


I want to write a function load: 'a option list -> 'a tree, that restores binary tree from the given list, which contains the elements in postfix order. If the list does not represent any tree, your function should raise the exception Load (you have to declare it earlier).

The tree is defined as :

type ‘a btree = L of ‘a | N of ‘a btree * ‘a btree

So far what I did was :

exception Load ;;

let rec load l =
    match l with
        | [] -> raise Load
        | Some x::_ -> L x
        | None::t -> N(?,load t)
;; 

Here's an example of an Input list:

[Some 2; Some 0; None; Some 5; Some 9; Some 20; None; None; None]

It's kind of tricky how to do it. Since the list is in postfix order, I'm wondering if it will be better to use List.foldright function ??


回答1:


I think you should try harder to do your homework (surely there is something interesting to learn), but as you apparently don't care:

let load input =
  let rec load stack = function
    | [] -> stack
    | Some elem :: rest -> load (L elem :: stack) rest
    | None :: rest ->
      match stack with
        | right :: left :: stack -> load (N(left, right) :: stack) rest
        | [] | [_] -> failwith "incorrect node arity"
  in
  match load [] input with
    | res :: [] -> res
    | [] -> failwith "no input"
    | _ :: _ :: _ -> failwith "remaining nodes"


来源:https://stackoverflow.com/questions/10799582/ocaml-list-to-tree

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!