【问题标题】:writing a recursive function to count the depth of a tree编写递归函数来计算树的深度
【发布时间】: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


【解决方案1】:

一棵空树的深度为0,一个节点的深度为1加上其子节点的最大深度:

depth :: Tree a -> Int
depth Empty = 0
depth (Node _ l r) = 1 + max (depth l) (depth r)

【讨论】:

    【解决方案2】:

    给你,很简单,递归遍历一个list和一个Tree差不多,只是数据类型不同。每次击中相关树的分支时添加 1:

    tDepth :: Tree a -> Int
    tDepth Empty = 0
    tDepth (Node _ left right) = 1 + max (tLength left)  (tLength right)
    

    【讨论】:

    • 这不是树的深度,而是它的节点数。
    • 是的,你们在哪里对,我的错,现在已经修好了,虽然没有意义,因为你已经给出了答案
    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 2021-11-28
    • 2021-08-03
    • 2013-07-05
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多