type BSTree a = BinaryTree a
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
flattenTree :: BinaryTree a -> [a]
flattenTree tree = case tree of
Null -> []
Node left val right -> (flattenTree left) ++ [val] ++ (flattenTree right)
isBSTree :: (Ord a) => BinaryTree a -> Bool
isBSTree btree = case btree of
Null -> False
tree -> (flattenTree tree) == sort (flattenTree tree)
Ce que je veux faire est d'écrire une fonction pour déterminer si l'arbre donné est un arbre de recherche binaire, ma méthode est de regrouper toutes les valeurs dans une liste et d'importer Data.List
puis de trier la liste pour savoir si elles sont égales, mais cela est un peu compliqué. Pouvons-nous le faire sans importer d'autre module?
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.sort
, pas avecflattenTree
, ce qui est assez paresseux.Réponses:
Voici une façon de le faire sans aplatir l'arbre.
De la définition, ici,
on peut voir que traverser l'arbre de gauche à droite, en ignorant
Node
et entre parenthèses, vous donne une séquence alternée deNull
s eta
s. Autrement dit, entre toutes les deux valeurs, il y a unNull
.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 à chacuneNull
. Comme il y aNull
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 etTop
éléments, comme suit:Vérifions maintenant qu'un arbre donné satisfait aux exigences d'être à la fois en ordre et entre des bornes données.
Un arbre de recherche binaire est un arbre qui est dans l'ordre et entre
Bot
etTop
.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.
la source
Voici un indice: créer une fonction auxiliaire
où
BSTResult a
est défini commeVous devriez pouvoir procéder de manière récursive, en exploitant les résultats sur les sous-arbres pour piloter le calcul, en particulier le minimum et le maximum.
Par exemple, si vous avez
tree = Node left 20 right
, avecisBSTree' left = NonEmptyBST 1 14
etisBSTree' right = NonEmptyBST 21 45
, alorsisBSTree' tree
devrait l'êtreNonEmptyBST 1 45
.Dans le même cas, sauf pour
tree = Node left 24 right
, nous devrions plutôt avoirisBSTree' tree = NotBST
.La conversion du résultat en
Bool
est alors triviale.la source
BSTResult a
et pliez-le. :) (ou même si ce n'est pas un Monoïde légal ....)Oui , vous n'avez pas besoin de trier la liste. Vous pouvez vérifier si chaque élément est inférieur ou égal à l'élément suivant. Ceci est plus efficace puisque nous pouvons le faire dans O (n) , alors que l'évaluation de la liste triée prend complètement O (n log n) .
On peut donc vérifier cela avec:
On peut donc vérifier si l'arbre binaire est un arbre de recherche binaire avec:
Je pense que l'on peut affirmer que
Null
lui - même est un arbre de recherche binaire, car c'est un arbre vide. Cela signifie donc que pour chaque nœud (il n'y a pas de nœuds), les éléments du sous-arbre gauche sont inférieurs ou égaux à la valeur du nœud, et les éléments du sous-arbre droit sont tous supérieurs ou égaux à la valeur du nœud .la source
Nous pouvons procéder de gauche à droite sur l'arbre comme ceci:
Inspiré par John McCarthy's
gopher
.La liste déroulante explicite peut être éliminée avec la continuation-passage,
Le maintien d'un seul élément, le plus grand à ce jour , suffit.
la source