Мне нужно написать рекурсивную функцию, которая, учитывая тип данных дерева , вернет глубину дерева. Пустое дерево должно вернуть 0. Одно дерева корневого узла должно возвращать 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, и я буду признателен, если кто-то мне поможет.
Вы указали глубину пустого дерева и лист. Это уже дает вам первые два случая определения вашей функции (хотя указание глубины для листов технически избыточно). Но какова глубина узла с детьми? После того, как вы напишете это формально, должно стать очевидным, каков должен быть последний случай определения функции. – sepp2k
Обратите внимание, что вам не нужен ваш второй случай для 'insertTree'; общий случай 'Node b left right' сводится к базовому случаю' Empty', когда поддерево, которое вы рекурсируете, пуст. – chepner