Haskell - 二进制搜索树

时间:2017-06-19 15:25:06

标签: haskell binary-search-tree

作为Haskell的初学者,我目前正试图了解BST。目前我正在尝试按顺序在树上执行折叠。

这是我到目前为止所得到的,但它会产生错误。

public String getIMEI(Activity activity) {
    TelephonyManager telephonyManager = (TelephonyManager) activity
            .getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

我现在真的傻眼了,因为我现在已经工作了很长时间才弄明白问题究竟是什么,但我似乎没有找到解决方案。

1 个答案:

答案 0 :(得分:3)

按顺序表示您(1)首先处理左子树,(2)然后处理节点本身,(3)最后处理正确的子树。

没有值的叶子

根据您的功能,BinaryTree a的定义可能是:

data BinaryTree a = Leaf | Node (BinaryTree a) a (BinaryTree a)

这意味着有两种情况:如果是叶子,则没有数据,所以我们只返回给定的值:

inorder' _ a Leaf = a -- with an uppercase, otherwise it does match all

对于Node案例,我们上面已经说明了如何运作:

inorder' f a (Node left val right) = inorder' f c right
    where b = inorder' f a left
          c = f b val

或完整:

inorder' :: (b -> a -> b) -> b -> BinaryTree a -> b
inorder' _ a Leaf = a
inorder' f a (Node left val right) = inorder' f c right
    where b = inorder' f a left
          c = f b val

留下值

在这种情况下,BinaryTree定义如下:

data BinaryTree a = Leaf a | Node (BinaryTree a) a (BinaryTree a)

如果叶子有值,我们只需要修复第一个子句:

inorder' :: (b -> a -> b) -> b -> BinaryTree a -> b
inorder' f b (Leaf a) = f b a
inorder' f a (Node left val right) = inorder' f c right
    where b = inorder' f a left
          c = f b val