haskell - 在 Haskell 中变换一棵树
问题描述
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
data RoseTree a = RoseNode a [RoseTree a]
deriving Show
binaryTreeToRose :: BinaryTree a -> RoseTree a
binaryTreeToRose btree = case btree of
Node Null a Null -> RoseNode a []
Node left a Null -> RoseNode a [binaryTreeToRose left]
Node Null a right -> RoseNode a [binaryTreeToRose right]
Node left a right -> RoseNode a [binaryTreeToRose left]++[binaryTreeToRose right]
我尝试在 Haskell 中编写一个将二叉树转换为玫瑰树的函数。但我不知道如何用递归解决这个问题。
解决方案
您已经在递归地解决这个问题。的确,你呼吁binaryTreeToRose
孩子们left
和right
。所以你binaryTreeToRose
根据自己来定义。
但是,您的功能不是全部。因为binaryTreeToRose Null
它会出错。我们可以将返回类型设为 a Maybe (RoseTree a)
:
import Data.Maybe(catMaybes)
binaryTreeToRose :: BinaryTree a -> Maybe (RoseTree a)
binaryTreeToRose Null = Nothing
binaryTreeToRose (Node l a r) = Just (RoseNode a (catMaybes (map binaryTreeToRose [l, r])))
甚至更短:
import Data.Maybe(mapMaybe)
binaryTreeToRose :: BinaryTree a -> Maybe (RoseTree a)
binaryTreeToRose Null = Nothing
binaryTreeToRose (Node l a r) = Just (RoseNode a (mapMaybe binaryTreeToRose [l, r]))
推荐阅读
- oauth-2.0 - 捷径 OAuth/OIDC 的风险?
- java - TestNG 数据提供者将对象二维数组转换为 Hashtable - 抛出 MethodMatcherException
- python - Python beautifulsoup - 如何获取项目,稍后在浏览器中加载
- html - 如何在屏幕底部定位元素?
- python - 如何在 django 的 xhtml2pdf 中加载 qr_code?
- python - SMTP Yahoo IPv6 错误 getsockaddrarg() 正好需要 2 个参数(给定 4 个)
- python - 如何解决 Python 中有关 minizinc 包的此错误?
- python - / 不支持的操作数类型:自定义保存上的“int”和“NoneType” - Django 表单
- html - HTML 到 pdf 损坏的图像
- javascript - 如何在渲染方法上返回一个 div 和一个数组映射?