在SML中获取子树的问题

时间:2019-03-31 05:08:29

标签: functional-programming sml smlnj

我被困在编码中,必须在SML中获取给定节点的子树。

数据类型如下。

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

现在我必须编写函数,该函数将返回以给定节点为根的子树。

我写了一个辅助函数'nodeExist(n,tree)',它将检查树上是否存在该节点。然后我尝试了以下某种方式-

datatype ctree = Empty | Node of char*ctree*ctree

它没有给出正确的输出。Node(x,left,right)能否给出子树,或者我应该正确地遍历树以得到它。

1 个答案:

答案 0 :(得分:3)

我会从您的评论开始,因为它非常接近:

fun subtree(x, Empty) = Empty 
  | subtree(x, T as Node(y, left, right)) = 
        if x = y 
        then T 
        else subtree(x, left) orelse subtree(x, right)

但是它有类型问题,因为orelse需要两个真值,而不是两个树。
您需要做一些逻辑上相似的事情,但要用树代替事实。

查看前进方向的一种方法是将orelse重写为等效案例分析

fun subtree(x, Empty) = Empty 
  | subtree(x, T as Node(y, left, right)) = 
        if x = y 
        then T 
        else let val l = subtree(x, left) in
             case l of
                 true => l
               | false => subtree(x, right)
             end

从这里开始,我们可以将布尔型案例替换为树型案例:

fun subtree(x, Empty) = Empty 
  | subtree(x, T as Node(y, left, right)) = 
        if x = y 
        then T 
        else let val l = subtree(x, left) in
             case l of
                 Node _ => l
               | Empty  => subtree(x, right)
             end

或者,它可以重新排列以使其更短

fun subtree(x, Empty) = Empty 
  | subtree(x, T as Node(y, left, right)) = 
        if x = y 
        then T 
        else case subtree(x, left) of
               Empty  => subtree(x, right)
             | t => t

(这是找到解决方案的一种非常round回的方法,但这是我在尝试重新设计您的功能时的思路。)