Как добавить узлы дерева в список? - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу добавить узлы дерева в список в предзаказе без объединения списков.

type 'a bintree = Nil | BT of 'a bintree * 'a * 'a bintree
let preorder t = 
    let rec addpre t list = 
        match t with
        | Nil -> list
        | BT (left, v, right) -> addpre left (v :: list)
    in addpre t [];;

let ab = BT (BT(Nil, 2, Nil),
             7,
             BT(BT(Nil, 5, Nil), 6, BT(Nil, 11, Nil)))
let r = preorder ab;;

Как вы можете видеть, я знаю, как добавить узлы из ветви (левой или правой), но я не знаю, как добавить узлы из обеих ветвей. Вы можете мне помочь?

UPDATE

Думаю, мне удалось это сделать

let preorder t = let rec addpre t list = 
                         match t with
                                    | Nil -> list
                                    | BT (left, v, right) -> v :: addpre left (addpre right list)
                 in addpre t [];;

Это правильно?

1 Ответ

0 голосов
/ 12 ноября 2018

Возможно, вы захотите вычислить countpree над right после того, как вычислили его по left. Локальная привязка вычисления над левой частью может помочь. Что-то вроде

| BT (left, v, right) -> 
      let leftpreoder = countpre left (v :: list) 
      in ...
...