首页 文章

删除节点并将其添加到树中

提问于
浏览
3

我有一个任务,我无法弄清楚该怎么做 . 我有一棵树,上面有他们的名字,出生和死亡年份 . 在这里思考家谱 . 我有一堆数据类型来处理年龄,名字,树本身等等,然后我有一堆人和一棵树 .

数据类型是:

datatype year    = Year of int | UnkYear | Irrelevant
datatype name    = Name of string | UnkName
datatype sex     = Man | Woman | UnkSex
datatype person  = Person of name * sex * year * year
datatype parents = Dad | Mom
datatype tree    = Unspec | Info of person * tree * tree

首先,我需要能够从这个位置移除某人以及“在”下面的所有内容 - 所以删除“妈妈”会删除妈妈和她的父母,祖父母等等 . 如果在被调用的位置没有人,该功能应该返回树 . 它应该是这样的:删除:树*父母列表 - >树和调用是删除(吨,位)

这就是我所拥有的,但它并不完全正确 . 我被告知我可以用4行完成 .

fun replace (Info(n,mf,ft) , Mom::[]) = Info(n,replace(mf,[]),Unspec)
  | replace (Info(n,mf,ft) , Dad::[]) = Info(n,Unspec,replace(ft,[]))
  | replace (Info(n,mf,ft) , [])      = Info(n,mf,ft)
  | replace (Info(n,mf,ft) , Mom::xs) = Info(n,replace(mf,[]),replace(ft,xs))
  | replace (Info(n,mf,ft) , Dad::xs) = Info(n,replace(mf,xs),replace(ft,[]))
  | replace (Unspec , x::xs)          = Unspec
  | replace (Unspec , [])             = Unspec;

我有一个想法:

fun replace (Info(n,mf,ft) , Mom::xs) = Info(n,mf,replace(ft,xs))
  | replace (Info(n,mf,ft) , Dad::xs) = Info(n,replace(mf,xs),ft)
  | replace (Info(n,mf,ft) , [])      = Info(n,mf,ft)
  | replace (Unspec , xs)             = Unspec;

但这不正确 . 我该怎么办?

我也应该能够将一个人p插入到位置pos的树中 - 如果该位置不存在,它应该只返回树 . insert:tree * parent list * person - > tree

我无法理解这一点,我希望有人能够帮助我 . 我希望我已经足够清楚(我知道它很长) .

1 回答

  • 2

    (重新发布显然我之前的答案没有在数据库崩溃中幸存下来) .

    你是在列表的头部决定是否分支到母亲或父亲子树 . 这是对的 . 然后使用列表的尾部作为路径的其余部分 . 这也是正确的 . 但是,如果列表为空(即您已到达目的地),则执行以下操作:

    | remove (Info(n,mf,ft) , [])      = Info(n,mf,ft)
    

    换句话说:没什么 . 如果您将其更改为:

    | remove (Info(n,mf,ft) , [])      = Unspec
    

    它将按预期工作,用Unspec替换路径引导您到达的树的节点 .

相关问题