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 Node
und Klammern eine abwechselnde Folge von Null
s und a
s 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 Null
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 und Top
Elementen 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 Bot
und 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.
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.