[英]Haskell leftmost deepest node of tree
假设我有一个二叉树结构定义为
data IntTree = Empty | Node Int IntTree IntTree
和树
Node 0 (Node 1 Empty Empty)(Node 2 (Node 3 Empty Empty)(Node 4 Empty Empty))
如何提取最左边最深的节点(即Node 3 Empty Empty
)?
您应该利用递归并定义一个返回节点深度的辅助函数,然后为每个 innode 选择最深的子节点。 这样的函数看起来像:
leftmostDeep : IntTree -> IntTree
leftmostDeep = fst . go
where go n@(Node _ Empty Empty) = (n, 0)
go n@(Node _ Empty r) = let (nr, dr) = go r in (nr, dr+1)
go n@(Node _ l Empty) = let (nl, dl) = go l in (nl, dl+1)
go (Node l r) = …
where (na, da) = go l
where (nb, db) = go r
其中…
作为练习。 这应该确定哪个项目最深,并且作为决胜局,返回左子树。 您还应该将该节点的深度增加一。
[Node 0 (Node 1 Empty Empty)(Node 2 (Node 3 Empty Empty)(Node 4 Empty Empty))]
[ Node 1 Empty Empty, Node 2 (Node 3 Empty Empty)(Node 4 Empty Empty) ]
[ Empty,Empty, Node 3 Empty Empty, Node 4 Empty Empty ]
[ Empty,Empty, Empty,Empty ]
[ ]
建议
deepest :: IntTree -> [Int]
deepest = pure >>> iterate (>>= g) >>> takeWhile (not . null)
>>> reverse >>> drop 1 >>> take 1
>>> (>>= \ xs -> [i | Node i _ _ <- xs])
where
g (Node _ lt rt) = [lt, rt]
g Empty = []
然后我们得到
> deepest $ Node 0 (Node 1 Empty Empty)
(Node 2 (Node 3 Empty Empty) (Node 4 Empty Empty))
[3,4]
所以剩下的就是从中take 1
,如果你愿意的话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.