【发布时间】:2017-03-19 05:27:02
【问题描述】:
我必须写一个递归函数,给定一棵树 数据类型,将返回树的深度。一棵空树应该返回 0. 单个根节点 Tree 应该返回 1。
预期输出:
let treeCons x = (\x -> foldl (flip insertTree) Empty x) x
depth (treeCons []) -> 0
depth (treeCons [5,4,6,3,7,1]) -> 4
depth (treeCons [1,2,5,8,9,4,7]) -> 5
depth (treeCons [5,4,6,3,7,1,2,5,8,9,4,7,8,5,3,4]) -> 6
我写了以下数据类型和插入函数:
data Tree a = Node a (Tree a) (Tree a) | Empty deriving (Show, Eq)
insertTree :: (Ord a) => a -> Tree a -> Tree a
insertTree a Empty = Node a Empty Empty
insertTree a (Node b Empty Empty) = if (a <= b) then (Node b (Node a Empty Empty) Empty) else (Node b Empty (Node a Empty Empty))
insertTree a (Node b left right) = if (a <= b) then (Node b (insertTree a left) right ) else (Node b left (insertTree a right))
但是,我不知道如何编写深度函数。我是 haskell 的新手,如果有人帮助我,我将不胜感激。
【问题讨论】:
-
你说的是一棵空树的深度和一片叶子的深度。这已经为您提供了函数定义的前两种情况(尽管指定叶子的深度在技术上是多余的)。但是有孩子的节点的深度是多少?一旦你正式把它写下来,函数定义的最后一种情况应该是显而易见的。
-
请注意,
insertTree不需要第二个案例;当您递归的子树为空时,一般情况Node b left right会简化为基本情况Empty。
标签: haskell recursion functional-programming higher-order-functions