【问题标题】:How to check if node is a leaf in binary tree (Haskell)如何检查节点是否是二叉树中的叶子(Haskell)
【发布时间】:2020-05-27 17:47:53
【问题描述】:

我需要检查一个节点是否是我的二叉树中的叶子。这是我当前的代码。

它向我发送一条错误消息说: “hw3_71937.hs:C:\Users\lenovo\Desktop\����\���� HASKELL\hw3_71937.hs:(22,1)-(25,91):isLeaf 函数中的非详尽模式”

我不知道如何递归检查下一个节点是否是叶子。任何帮助将不胜感激。

【问题讨论】:

  • 如果用isLeaf node Empty调用会怎样?

标签: haskell binary binary-tree


【解决方案1】:

守卫:

  | <b>tree == Empty</b> = False

永远不可能是真的,因为在你的子句的开头:

isLeaf node tree@(<b>Node el left right</b>)

你说这是Node,而不是Empty。这也是您没有涵盖的情况:如果您传递了一个 Empty(由于递归,最终您可以传递一个 Empty),则不会匹配任何模式。

话虽如此,我认为你把这件事弄得太复杂了。你可以这样写:

isLeaf :: Eq a => a -> BTree a -> Bool
isLeaf _ Empty = False
isLeaf x (Node x' Empty Empty) = x == x'
isLeaf x (Node _ l r) = isLeaf x l || isLeaf x r

或使用where 子句:

isLeaf :: Eq a => a -> BTree a -> Bool
isLeaf x = go
    where go Empty = False
          go (Node x' Empty Empty) = x == x'
          go (Node _ l r) = go l || go r

【讨论】:

  • 非常感谢,它解决了问题。我没有注意到守卫永远不会执行。
  • @АтанасИванов 如果它是正确的,请接受这个答案
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多