【问题标题】:delete empty nodes from tree从树中删除空节点
【发布时间】:2019-11-22 07:58:57
【问题描述】:

我想实现一个删除树中所有空子节点的函数:

makeUnhollow (Node 5 Empty Empty) => Leaf 5
makeUnhollow (Leaf 5) => Leaf 5
makeUnhollow (Node 5 (Leaf 4) Empty) => (Node 5 (Leaf 4) Empty)

这是我当前的代码:

makeUnhollow :: Tree a -> Tree a
makeUnhollow  (Node a Empty Empty)= Leaf a
makeUnhollow (Leaf a) = Leaf a
makeUnhollow a = a

但不知何故,我在这段代码中遇到了失败:

Tests.hs:130:
wrong result
expected: Node 6 (Leaf 5) (Leaf 7)
but got: Node 6 (Node 5 Empty Empty) (Node 7 Empty Empty)

【问题讨论】:

  • makeUnhollow 目前不会递归到树中。使其递归。

标签: haskell binary-search-tree


【解决方案1】:

删除所有 Empty 树中的孩子似乎有点困难:

  • Node a Empty Empty可以变成Leaf a
  • 如果你的根节点是Empty怎么办?
  • Node a Empty (Leaf b) 会是什么?

我从您的测试中了解到,您的目标只是将Node a Empty Empty 变成Leaf a,而不在乎只有一个孩子是Empty。 Mark Seemann 建议将makeUnhollow 转换为递归函数,这意味着您必须让它在最后一种情况下调用自己:

makeUnhollow :: Tree a -> Tree a
makeUnhollow (Node a Empty Empty) = Leaf a
makeUnhollow (Leaf a) = Leaf a
makeUnhollow Empty = ?                --  don't forget to match Empty
makeUnhollow (Node a left right) = ?  --  recurse on left, right :: Tree a

我可以直接调用函数unhollow,因为这也是一个祈使动词。

【讨论】:

  • 甚至是“unhollowed”,以获得更多声明性的感觉。 :)
  • 如果 leftright 在递归情况下都变为Empty 怎么办?
猜你喜欢
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2019-05-04
相关资源
最近更新 更多