Tree 向树中删除和添加节点

Tree 向树中删除和添加节点,tree,sml,Tree,Sml,我有一个任务,我不知道该怎么办。我有一棵树,上面写着人们的名字、出生和死亡年份。想想这里的家谱。我有一堆数据类型来处理年龄、名称、树本身等等,然后我有一群人和一棵树 数据类型包括: datatype year = Year of int | UnkYear | Irrelevant datatype name = Name of string | UnkName datatype sex = Man | Woman | UnkSex datatype person = Pe

我有一个任务,我不知道该怎么办。我有一棵树,上面写着人们的名字、出生和死亡年份。想想这里的家谱。我有一堆数据类型来处理年龄、名称、树本身等等,然后我有一群人和一棵树

数据类型包括:

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
首先,我需要能够从这个位置删除某人和它下面的所有内容-因此删除“Mom”将删除Mom和她的父母、祖父母等。如果没有人在这个位置被调用,函数应该返回树。应该是这样的: 移除:树*父列表->树,呼叫为移除(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;
但这是不正确的。我该怎么办

我还应该能够在pos位置的树t中插入一个人p,如果这个位置不存在,它应该返回树。 插入:树*父母列表*人->树

我只是想不通,我希望有人能帮助我。我希望我在这方面已经足够清楚了(我知道它很长)。

(很明显,我之前的回答在数据库崩溃后没有幸存下来)

您将在列表的最前面决定是分支到父子树还是母子树。这是正确的。然后使用列表的尾部作为路径的其余部分。这也是正确的。但是,当列表为空(即您已到达目的地)时,您可以执行以下操作:

| remove (Info(n,mf,ft) , [])      = Info(n,mf,ft)
换句话说:什么都没有。如果将此更改为:

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

它将按预期工作,将路径指向的树节点替换为Unspec。

非常感谢!你知道我会如何把一个人插入树中(或者你能给我一个正确的方向吗)?@乔治:你可能应该单独问这个问题,并提供更多信息,包括:你想在哪里插入新的人?根据类似于移除的路径?如果是这样的话:目前处于该职位的人会发生什么?或者,您是否只允许在当前未指定的位置插入人员?最重要的是:到目前为止你得到了什么?很好,谢谢。我会自己做更多的工作,如果其他一切都失败了,我会回到这里:)我现在把它修好了,我希望我把它修好了。n是树的根,属于person类型。Info(n,mf,ft),个人*树*树的信息有人有任何指针来替换BST的元素吗?