问题描述
我的任务是编写一个函数,该函数将计算二叉树的大小。这是树形结构的实现:
datatype 'a bin_tree =
Leaf of 'a
| Node of 'a bin_tree (* left tree *)
* int (* size of left tree *)
* int (* size of right tree *)
* 'a bin_tree (* right tree *)
我的教授给了我这个模板:
fun getSize Empty = 0
| getSize (Leaf _) = 1
| getSize (Node(t1,_,t2)) = getSize t1 + getSize t2;
我想知道是否需要操纵它以与我的树结构保持一致才能使它起作用?
解决方法
'a bin_tree
类型可记住每个子树的大小。因此,如果允许您假设存储的大小正确,则可以不递归地返回树的大小。
您的教授提供的模板不适用于此类型,但适用于不记住大小的另一种树类型。它演示了如何通过模式匹配和递归来计算此类树的大小,这两种语言功能也都需要使用。
因此,任务是为'a bin_tree
类型编写一个完全不同的函数。您必须找出正确的模式匹配方法。首先,getSize
的模板不会累加:在三种情况下,三个构造函数分别为Empty
,Leaf x
和Node (L,x,R)
。但是'a bin_tree
类型只有两个构造函数,Leaf x
和Node (L,sizeL,sizeR,R)
。
因此,您想了解如何对数据类型执行模式匹配。