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

时间:2010-10-08 23:20:12

标签: tree sml

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

数据类型为:

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

首先,我需要能够从这个位置移除某人以及“在”下面的所有内容 - 所以移除“妈妈”将移除母亲和她的父母,祖父母等。如果在该位置没有人被叫,则该功能应该归还树。应该是这样的: 删除:树*父母列表 - >树和呼叫被删除(t,pos)

这就是我所拥有的,但它并不完全正确。我被告知我可以用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 * parents list * person - >树

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

1 个答案:

答案 0 :(得分:2)

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

您正在选择列表的负责人来决定是否分支到母亲或父亲子树。这是对的。然后使用列表的尾部作为路径的其余部分。这也是正确的。但是当列表为空(即您已到达目的地)时,请执行以下操作:

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

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

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

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