繁体   English   中英

二元树作为嵌入对

[英]Binary trees as innested pairs

我试图将一般的二叉树表示为一对。

我将使用SML语法作为示例。 这是我的btree类型定义:

datatype btree = leaf | branch of btree*btree;

所以,我想写一个函数,给定一个btree,打印以下内容:

bprint leaf = 0
bprint (branch (leaf,leaf)) = (0,0)
bprint (branch (leaf, branch (leaf,leaf))) = (0, (0, 0))

等等。

问题是这个函数总是返回不同的类型。 这显然是SML的问题,也许是其他功能语言的问题。

任何想法?

因为您要做的就是将树结构打印到屏幕上,您可以这样做,并将函数的返回类型设置为unit 这不是试图返回元组(0, (0, 0))只是将字符串(0,(0,0 (0, (0, 0))打印到屏幕。 这样你就不会遇到任何类型的困难。

如果你真的不需要其他地方的字符串表示,正如其他人已经提到的那样,只需打印树就可能是最简单的方法:

open TextIO

datatype btree = leaf | branch of btree * btree

fun print_btree leaf = print "0"
  | print_btree (branch (s, t)) =
    (print "("; print_btree s; print ", "; print_btree t; print ")")

如果您还希望能够获得表示btree的字符串,那么天真的解决方案将是:

fun btree_to_string leaf = "0"
  | btree_to_string (branch (s, t)) =
    "(" ^ btree_to_string s ^ ", " ^ btree_to_string t ^ ")"

但是,我并不真的推荐这种变体,因为对于大btree来说,由于许多字符串连接存在问题。

值得思考的是以下变体,它通过一个技巧(例如也在Haskell的Show类中使用)避免了连接问题,即,不是处理字符串,而是处理从char列表到char列表的函数。 然后可以用函数组合代替连接

fun btree_to_string' t =
  let
    fun add s t = s @ t
    fun add_btree leaf = add [#"0"]
      | add_btree (branch (s, t)) =
        add [#"("] o add_btree s o add [#",", #" "] o add_btree t o add [#")"]
  in implode (add_btree t []) end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM