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)
Was ich tun möchte, ist, eine Funktion zu schreiben, um zu bestimmen, ob der angegebene Baum ein binärer Suchbaum ist. Meine Methode besteht darin, alle Werte in einer Liste zu gruppieren und zu importieren Data.List
und dann die Liste zu sortieren, um festzustellen, ob sie gleich sind, aber es ist etwas kompliziert. Können wir dies tun, ohne ein anderes Modul zu importieren?
haskell
tree
binary-tree
binary-search-tree
predicate
Jayyyyyy
quelle
quelle
flattenTree
zuerst definieren . Sie könnenFalse
frühzeitig zurückkehren, wenn ein Knoten die Sucheigenschaft verletzt, ohne den gesamten auf diesem Knoten verwurzelten Teilbaum durchlaufen zu müssen.sort
, nicht mitflattenTree
, was faul genug ist.Antworten:
Hier ist eine Möglichkeit, dies zu tun, ohne den Baum zu plattieren.
Aus der Definition hier
Man kann sehen, dass das Durchlaufen des Baums von links nach rechts, Ignorieren
Node
und Klammern eine abwechselnde Folge vonNull
s unda
s ergibt . Das heißt, zwischen jeweils zwei Werten befindet sich einNull
.Mein Plan ist es, zu überprüfen, ob jeder Teilbaum die entsprechenden Anforderungen erfüllt : Wir können die Anforderungen an jedem Teil verfeinern
Node
, uns daran erinnern, zwischen welchen Werten wir liegen, und sie dann an jedem testenNull
. Da esNull
zwischen jedem Wertepaar in der Reihenfolge ein Wertpaar gibt, haben wir getestet, dass alle in der Reihenfolge (von links nach rechts) liegenden Paare nicht abnehmen.Was ist eine Anforderung? Es ist eine lose Unter- und Obergrenze für die Werte im Baum. Um Anforderungen auszudrücken, einschließlich der Anforderungen am linken und rechten Ende, können wir jede Bestellung mit
Bot
Tom undTop
Elementen wie folgt erweitern:Lassen Sie uns nun überprüfen, ob ein bestimmter Baum die Anforderungen erfüllt, sowohl in der richtigen Reihenfolge als auch zwischen den angegebenen Grenzen zu sein.
Ein binärer Suchbaum ist ein Baum, der in der Reihenfolge und zwischen
Bot
und angeordnet istTop
.Wenn Sie die tatsächlichen Extremwerte in jedem Teilbaum berechnen und nach außen sprudeln, erhalten Sie mehr Informationen als Sie benötigen, und dies ist in den Randfällen, in denen ein linker oder rechter Teilbaum leer ist, schwierig. Das Aufrechterhalten und Überprüfen der Anforderungen , das Verschieben nach innen, ist eher einheitlicher.
quelle
Hier ist ein Hinweis: Machen Sie eine Hilfsfunktion
wo
BSTResult a
ist definiert alsSie sollten in der Lage sein, rekursiv vorzugehen und die Ergebnisse von Teilbäumen zu nutzen, um die Berechnung voranzutreiben, insbesondere das Minimum und das Maximum.
Zum Beispiel, wenn Sie
tree = Node left 20 right
mitisBSTree' left = NonEmptyBST 1 14
und habenisBSTree' right = NonEmptyBST 21 45
, dannisBSTree' tree
sollte seinNonEmptyBST 1 45
.Im gleichen Fall außer
tree = Node left 24 right
sollten wir stattdessen habenisBSTree' tree = NotBST
.Das Konvertieren des Ergebnisses in
Bool
ist dann trivial.quelle
BSTResult a
und falten Sie es ein. :) (oder auch wenn es kein rechtmäßiger Monoid ist ....)Ja , Sie müssen die Liste nicht sortieren. Sie können überprüfen, ob jedes Element kleiner oder gleich dem nächsten Element ist. Das ist effizienter , da wir dies tun können , in O (n) , während die sortierte Liste Auswertung vollständig nimmt O (n log n) .
Wir können dies also überprüfen mit:
So können wir überprüfen, ob der Binärbaum ein binärer Suchbaum ist mit:
Ich denke, man kann behaupten, dass es
Null
sich um einen binären Suchbaum handelt, da es sich um einen leeren Baum handelt. Dies bedeutet also, dass für jeden Knoten (es gibt keine Knoten) die Elemente im linken Teilbaum kleiner oder gleich dem Wert im Knoten sind und die Elemente im rechten Teilbaum alle größer oder gleich dem Wert im Knoten sind .quelle
Wir können von links nach rechts über den Baum gehen:
Inspiriert von John McCarthy
gopher
.Die explizite Pushdown-Liste kann durch Weitergabe entfernt werden.
Es reicht aus, nur ein bislang größtes Element beizubehalten.
quelle