Hier ist eine Möglichkeit, dies zu tun, ohne den Baum zu plattieren.
Aus der Definition hier
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
Man kann sehen, dass das Durchlaufen des Baums von links nach rechts, Ignorieren Nodeund Klammern eine abwechselnde Folge von Nulls und as ergibt . Das heißt, zwischen jeweils zwei Werten befindet sich ein Null.
Mein Plan ist es, zu überprüfen, ob jeder Teilbaum die entsprechenden Anforderungen erfüllt : Wir können die Anforderungen an jedem Teil verfeinernNode , uns daran erinnern, zwischen welchen Werten wir liegen, und sie dann an jedem testenNull . Da es Nullzwischen 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 BotTom und TopElementen wie folgt erweitern:
data TopBot a = Bot | Val a | Top deriving (Show, Eq, Ord)
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.
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
Ein binärer Suchbaum ist ein Baum, der in der Reihenfolge und zwischen Botund angeordnet ist Top.
isBSTree :: Ord a => BinaryTree a -> Bool
isBSTree = ordBetween Bot Top
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.
flattenTreezuerst definieren . Sie könnenFalsefrühzeitig zurückkehren, wenn ein Knoten die Sucheigenschaft verletzt, ohne den gesamten auf diesem Knoten verwurzelten Teilbaum durchlaufen zu müssen.