Voici une façon de le faire sans aplatir l'arbre.
De la définition, ici,
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
on peut voir que traverser l'arbre de gauche à droite, en ignorant Node
et entre parenthèses, vous donne une séquence alternée de Null
s et a
s. Autrement dit, entre toutes les deux valeurs, il y a un Null
.
Mon plan est de vérifier que chaque sous-arbre satisfait aux exigences appropriées : nous pouvons affiner les exigences à chacune Node
, en nous souvenant des valeurs entre lesquelles nous nous trouvons, puis les tester à chacune Null
. Comme il y a Null
entre chaque paire de valeurs dans l'ordre, nous aurons testé que toutes les paires dans l'ordre (de gauche à droite) ne sont pas décroissantes.
Qu'est-ce qu'une exigence? C'est une limite inférieure et supérieure lâche sur les valeurs de l'arbre. Pour exprimer les exigences, y compris celles situées aux extrémités gauche et droite, nous pouvons étendre toute commande avec Bot
tom et Top
éléments, comme suit:
data TopBot a = Bot | Val a | Top deriving (Show, Eq, Ord)
Vérifions maintenant qu'un arbre donné satisfait aux exigences d'être à la fois en ordre et entre des bornes données.
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
Un arbre de recherche binaire est un arbre qui est dans l'ordre et entre Bot
et Top
.
isBSTree :: Ord a => BinaryTree a -> Bool
isBSTree = ordBetween Bot Top
Le calcul des valeurs extrêmes réelles dans chaque sous-arbre, leur propagation vers l'extérieur, vous donne plus d'informations que nécessaire, et est fastidieux dans les cas extrêmes où un sous-arbre gauche ou droit est vide. Maintenir et vérifier les exigences , les pousser vers l'intérieur, est plutôt plus uniforme.
flattenTree
premier. Vous pouvez revenirFalse
tôt si un nœud viole la propriété de recherche sans avoir à parcourir la totalité du sous-arbre enraciné sur ce nœud.