Aqui está uma maneira de fazer isso sem achatar a árvore.
A partir da definição, aqui,
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
pode-se ver que percorrer a árvore da esquerda para a direita, ignorando Node
e parênteses, fornece uma sequência alternada de Null
s e a
s. Ou seja, entre cada dois valores, existe um Null
.
Meu plano é verificar se cada subárvore atende aos requisitos adequados : podemos refinar os requisitos em cada um Node
, lembrando quais valores estamos entre eles e testá- los em cada um Null
. Como existe um Null
par de valores entre todos os em ordem, teremos testado que todos os pares em ordem (da esquerda para a direita) não diminuem.
O que é um requisito? É um limite inferior e superior solto nos valores da árvore. Para expressar requisitos, incluindo aqueles nas extremidades mais à esquerda e à direita, podemos estender qualquer pedido com Bot
tom e Top
elementos, da seguinte maneira:
data TopBot a = Bot | Val a | Top deriving (Show, Eq, Ord)
Agora vamos verificar se uma determinada árvore atende aos requisitos de estar em ordem e entre limites determinados.
ordBetween :: Ord a => TopBot a -> TopBot a -> BinaryTree a -> Bool
-- tighten the demanded bounds, left and right of any Node
ordBetween lo hi (Node l x r) = ordBetween lo (Val x) l && ordBetween (Val x) hi r
-- check that the demanded bounds are in order when we reach Null
ordBetween lo hi Null = lo <= hi
Uma árvore de pesquisa binária é uma árvore que está em ordem e entre Bot
e Top
.
isBSTree :: Ord a => BinaryTree a -> Bool
isBSTree = ordBetween Bot Top
A computação dos valores extremais reais em cada subárvore, borbulhando para fora, fornece mais informações do que você precisa e é minuciosa nos casos extremos em que uma subárvore esquerda ou direita está vazia. Manter e verificar os requisitos , empurrando-os para dentro, é bastante mais uniforme.
flattenTree
primeiro. Você pode retornarFalse
cedo se um nó violar a propriedade de pesquisa sem precisar percorrer toda a subárvore enraizada nesse nó.