在SML中将节点添加到树中

时间:2010-10-09 22:23:24

标签: 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

作业如下: 声明一个函数insert:tree * parents list * person - >树,因此调用insert(t,pos,p)将人p插入树i中的postion pos中 - 假设该位置存在于树中。如果不是,则应返回t。

所以我需要能够把一个人带到我的树上(让我们说妈妈)并用露西代替她(妈妈和露西都是使用数据类型的人预先声明的值)。

到目前为止,我有这个:

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

所有似乎都是删除任何处于t的位置并用p替换根 - 不完全是我想要它做的:S此外,模式匹配没有完成。

让我搬到这里的任何想法?

1 个答案:

答案 0 :(得分:3)

好的,当你到达给定的位置时,你想要用给定的人替换树中该点的人。你正在做的是,除了到达目的地之外,你每一步都要替换这个人,在这种情况下,你只需删除那里的节点。

所以你需要做的是:

如果parent-list尚未为空,请不要将n替换为p - 只需遍历相应的子树。

如果parent-list为空并且您当前位于Info-node,请使用p替换该节点中的人员。

如果parents-list为空并且您当前位于Unspec节点,请将Unspec替换为包含p的新Info-node和两个空子树(即Unspec或多个)。

如果您到达Unspec节点,尽管parent-list尚未为空,只需返回Unspec,保持树根据分配不变。

相关问题